0

ジェネリック変数を再利用できるのではないかと思っていました。たとえば、提供されたデータベースモデルを保存するジェネリッククラスがある場合:

 DataManager<ModelObject1> manager = new DataManager<ModelObject1>();
 ModelObject1 object = new ModelObject1();
 object.setSomeProperty();
 manager.save(object);

次に、同じオブジェクトを再利用して、新しいジェネリック変数を作成せずに別のタイプのモデルを保存できますか?どうすればこのようなことができますか?

 manager = null;
 manager = new DataManager<ModelObject2>();
 ModelObject2 object2 = new ModelObject2();
 object2.setSomeProperty();
 manager.save(object2);
4

2 に答える 2

3

それはコンパイルされません。同じ型ではないため、DataManager<ModelObject2>型の変数にを割り当てることはできません。DataManager<ModelObject1>

于 2013-02-09T23:58:41.973 に答える
2

型消去のため、aDataManager<ModelObject1>()は実際には作成時とまったく同じであるDataManager<ModelObject2>()ため、その観点からは、正しいキャストの後で再利用すべきではない理由はありません。

ただし、いくつかの注意点があります。定義するクラスに固有の何かへの参照を含むようにオブジェクトを変更すると、事態は複雑になります。

このようなことは、オブジェクトを安全に再利用できないことを意味します。

DataManager<ModelObject1> manager = new DataManager<ModelObject1>();
manager.setObject(new ModelObject1());

しかし、私は非常に正当な理由なしにそれに対して強くお勧めします。おそらく、マネージャーの作成が非常に重いプロセスである場合は、それらを再利用することを正当化できます。

ss.clear()このコードは正常にコンパイルされますが、キャストの前またはis.clear()後を強くお勧めします。そうしないと、 :がSet<integer>含まれることになります。String

public static void main(String[] args) {
    Set<String> ss = new HashSet<String> ();
    ss.add("Hello");
    Set<Integer> is = unsecureCast(ss);
}

static Set<Integer> unsecureCast(Set s) {
    return (Set<Integer>) s;
} 
于 2013-02-10T00:22:45.763 に答える