抽象类和泛型

时间:2014-01-27 22:08:00

标签: java oop generics

假设我有以下类:

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

为什么这样做以及这种转让的潜在危险是什么?

2 个答案:

答案 0 :(得分:2)

有人可以这样写:

public class OtherConcreteClass extends AbstractClass {
    ...
}

...

SomeOtherClass soc = SomeOtherClass.<OtherConcreteClass>myFunction();

在对myFunction的调用中,T是OtherConcreteClass,你不能将ConcreteClass强制转换为OtherConcreteClass。

答案 1 :(得分:0)

简而言之:T不一定是ConcreteClass,它也可以是ConcreteClass的任何兄弟(例如,如果你声明了ConcreteClass2也扩展了ConcreteClass)。