この質問は、私の最後の質問に部分的に関連しています。
ジェネリック オブジェクトのコレクションを表すジェネリック クラスがあります。
public interface MyObject<N extends Number>{}
public interface MyCollecion<N extends Number> {
public foo(MyObject<N> obj)
}
私の設計では、これらのオブジェクトのコレクションは、抽象クラス アプローチを通じてクライアント クラス (これを CollectionBuilder と呼びましょう) によって構築されます。
public interface AbstractCollectionFactory {
public abstract <N extends Number> MyCollection<MyObject<N>> createCollection(String collectionType);
}
ジェネリック コレクションは、次のように構築する必要があります。
public class CollectionBuilder{
AbstractCollectionFactory f;
public void buildDoubleCollection(){
MyCollection<MyObject<Double>> c = f.<Double>createCell("MyType");
}
public void buildIntegerCollection(){...}
}
わかりました。これで大丈夫です。CollectionBuilder は、指定する一般的な具象型 (この場合は Double) を認識しており、正しくビルドできます。これを警告なしでコンパイルでき、すべて正常に動作するはずです。
ここで、ジェネリックとプログラムの設計の両方に関連する質問があります。
CollectionBuilder によって構築されたコレクションを使用する必要があるアプリケーション内の別のクラスがあります (このクラスを UserClass と呼びましょう)。ユーザークラス:
MyCollection<MyObject<Double>>
特定の具象型がそのコレクション (または)であることを知る必要はありませんMyCollection<MyObject<Integer>>
。- MyCollection インターフェイスで定義されたいくつかのメソッドを呼び出して、これらのコレクションに対していくつかの操作を実行します。
- ジェネリック型を追加したくありません。
説明されている状況では、UserClass 内のジェネリック クラス MyCollection をパラメータ化しないのは悪い考えですか?
public UserClass{
MyCollection a; //warning
MyCollection<?> b; //no warning
public method(MyObject o){ //warning
a.foo(b); //compile
}
public method2(MyObject<?> o){
b.foo(o); //error do not compile
}
}
ジェネリック パラメータを指定しないと、Java コンパイラは常に警告を表示します。とにかく UserClass の内部からは、具体的なパラメーターがわからず (知りたくありません)、「?」で宣言することさえあります。MyCollection でメソッド foo を呼び出せないでください。
したがって、質問は次のとおりです。
- ジェネリック型への参照をパラメータ化しないことは常に悪いことですか?
- 1 の答えが NO の場合、それをしないのは正しい状況ですか?
- 1 の答えが YES の場合、ジェネリック型を知らなくても UserClass 内から MyCollection メソッドを使用するにはどうすればよいですか?
- 私のデザインは悪いですか?
明確になったことを願っています。私は何日もこの問題に苦労してきましたが、わかりません。私を助けてください。