假设我有以下类:
public abstract class AbstractClass {
...
}
public class ConcreteClass extends AbstractClass {
...
}
建设者:
public class Builder{
static public ConcreteClass build(){
...
}
}
和其他一些类中的泛型函数:
public <T extends AbstractClass> T myFunction(){
T a = Builder.build();
return a;
}
我的理解是编译器应该有足够的信息来允许这样的赋值,但是,它会引发错误:
类型不匹配:无法从ConcreteClass转换为T
为什么这样做以及这种转让的潜在危险是什么?
答案 0 :(得分:2)
有人可以这样写:
public class OtherConcreteClass extends AbstractClass {
...
}
...
SomeOtherClass soc = SomeOtherClass.<OtherConcreteClass>myFunction();
在对myFunction的调用中,T是OtherConcreteClass,你不能将ConcreteClass强制转换为OtherConcreteClass。
答案 1 :(得分:0)
简而言之:T不一定是ConcreteClass,它也可以是ConcreteClass的任何兄弟(例如,如果你声明了ConcreteClass2也扩展了ConcreteClass)。