【问题标题】:Abstract classes and generics抽象类和泛型
【发布时间】:2014-01-28 06:12:49
【问题描述】:

假设我有以下课程:

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

为什么会这样?这种分配的潜在危险是什么?

【问题讨论】:

  • 当您只想返回 AbstractClass 时,为什么要尝试使其在 T 上通用?
  • 当您尝试使用具有继承的构建器模式时,this post here 可能会有所帮助,尽管在发布此帖子后我完全理解了该问题,因此该帖子中的位置有点错误。
  • 可能例子有点太简单了,我只是想展示分配部分的例子,其他的都无关紧要。

标签: java oop generics


【解决方案1】:

有人可以这样写:

public class OtherConcreteClass extends AbstractClass {
    ...
}

...

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

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

【讨论】:

  • 感谢您的解释!
【解决方案2】:

简而言之:T 不必是 ConcreteClass,它也可以是 ConcreteClass 的任何同级(例如,如果您声明的 ConcreteClass2 也扩展了 ConcreteClass)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-15
    • 1970-01-01
    • 2023-04-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多