実行時にクラスの型だけがわかっているオブジェクトを受け入れる必要があるプログラムがあります。プログラムがオブジェクトを正しいクラス型に自動的にキャストバックさせることが可能かどうか疑問に思っていましたか?自動型キャスト
次のコードは現在のものです。私はそれがステップ・バイ・ステップを行うことを期待するかを説明します:
- は二組(クラスタイプ
Foo
の1、クラスタイプBar
の1)を追加しTryingSomething
インスタンスを作成します。 - セットはハッシュマップに追加されるはずです。この時点で私は既にEclipseから警告を受けて、セットが何らかの形で互換性がないことを警告します。しかし、タイプは同じです。何がここで間違っていた?
- 前の手順が意図したとおりに動作したと仮定して移動を続けます。私は再びメインメソッドのコレクションを取得したいが、正しいクラスタイプ(
Foo
とBar
)にキャストしたい。これは使えますか?そうでない場合は、オブジェクトを正しいクラス・タイプに戻すことができる代替手段がありますか? - (ボーナス)各コレクションに添付されている名前の文字列を使用して、さまざまなクラスタイプを区別することができます。ストリングを必要とせずに、ステップ3で結果を得ることが可能であればさらに良いでしょう。
私にいくつかの指摘を与えることができる誰にも感謝します。
class TryingSomething<T> {
private Map<String, Set<T>> map = new HashMap<String, Set<T>>();
public void addCollection(Set<T> s, String name){
this.map.put(name, s);
}
public void test(){
Set<Foo> foo = new HashSet<Foo>();
Set<Bar> bar = new HashSet<Bar>();
addCollection(foo, "foo");
addCollection(bar, "bar");
}
public Set<T> getCollections(String name){
return this.map.get(name);
}
@SuppressWarnings("unchecked")
public static void main(String[] args){
TryingSomething t = new TryingSomething();
Set<Foo> foo = new HashSet<Foo>();
Set<Bar> bar = new HashSet<Bar>();
t.addCollection(foo, "foo");
t.addCollection(bar, "bar");
Set<Foo> fooList = t.getCollections("foo");
Set<Bar> barList = t.getCollections("bar");
}
}
class Foo{
}
class Bar{
}
まず、 'addCollection'はジェネリックメソッドとして宣言され、独自の' T'を定義します。その 'T'はクラス' T'と同じではないので、エラーメッセージです。 ''を最初から削除してください。不要になります。 –
eran
私は今すぐ完全な答えを投稿することはできませんが、これについて考えてみましょう。あなたが 'getCollection'呼び出しの文字列をユーザ提供の文字列で置き換えるとします。コンパイラは、その値が何であるかを予測することはできません。どのようにあなたのコードがブレークしていないかコンパイラが知ることができますか(これは**問題そのものではなく、あなたがしようとしていることはそれほど意味をなさないとのヒントです...) – Amit
@eran私はあなたが私に与えた提案を編集しました。エラーは 'test()'メソッドの2つのaddCollection/2呼び出しに移動しました。私はその情報をメインメソッドに移して読みやすくしました(そして 'test()'メソッドを削除しました)。しかし、メインメソッドではエラーが出ません。それは変だ。 – Babyburger