为了减少项目中的代码重复,我在泛化一些类时出错,情况如下:
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 多态性概念,并正确地执行正确的分配以实现正确的类。现在我有两个问题;
- 有人可以清楚地解释为什么在 Java 中这是被禁止的,出于什么正当理由?
- 如何通过使用类型参数或通配符来实现这样的功能?