プロジェクトでコードの重複を減らすためにいくつかのクラスを一般化するときにエラーが発生しました。その場合は次のとおりです。
interface ClassRoot{}
public class ClassChild1 implements ClassRoot{
// constructor is omitted for simplicity
public Collection<ClassChild1> createList(){
Collection<ClassChild1> col = getCollectionFromSomewhere();
return col;
}
}
public class Class1{
protected <T extends ClassRoot> Collection<T> doSth(){
Collection<T> myCol = null;
ClassChild1 child = new ClassChild1();
// here I get compile time assignment error
// also (assuming that myCol not null) myCol.add(new ClassChild1());
// is not permitted.
myCol = child.createList();
return myCol;
}
}
それはポリモーフィズム現象に反していませんか?たとえば、
List<Object> list1;
次のものには決してできません (また、型安全性のために割り当てるべきではありません):
List<String> list2;
しかし、ここでは私の場合は異なります.OOPポリモーフィズムの概念を利用することを期待して、特定のクラスを拡張するタイプパラメータを指定し、正しいクラスを正確に実装する割り当てを行いました. 2 つの質問があります。
- 正当な理由で、Javaで禁止されている理由を誰かが明確に説明できますか?
- 型パラメーターまたはワイルドカードを使用して、このような機能を実装するにはどうすればよいですか?