java - 使用有界泛型类扩展另一个泛型类会产生未知类型

标签 java generics

想象一下以下类层次结构:

abstract class Train {}
class BulletTrain extends Train {}

abstract class Base<T> {}
abstract class TrainBuilder<T extends Train> extends Base<T> {}

class BulletTrainBuilder<T extends BulletTrain> extends TrainBuilder<T> {
    T getBulletTrain() {
        BulletTrain someBulletTrain;
        // Make some kind of BulletTrain and put it in someBulletTrain
        return someBulletTrain; // Compile Error: BulletTrain does not match T
    }
}

getBulletTrain 中,似乎无法返回 BulletTrain 的子类或 BulletTrain 实例,因为 Java 会产生一个编译错误,其中指出特定子类(或 BulletTrain 本身)与 T 不匹配。

这里的类型信息是否以某种方式丢失了?

最佳答案

类型信息并未丢失,只是从 BulletTrainBuilder 中您无法确定 TBulletTrain 而不是某个子类其中。

例如,如果我这样做会怎样:

BulletTrainBuilder<FastBulletTrain> builder = ... ;

调用 getBulletTrain 会尝试将 BulletTrain 转换为 FastBulletTrain 并抛出异常。

看起来你只想这样做:

class BulletTrainBuilder extends TrainBuilder<BulletTrain> {
    public BulletTrain getBulletTrain() { ... }
}

否则,如果您需要将 T 进一步委派到层次结构中,那么您将无法知道要做您正在尝试做的事情是什么。您还需要将 someBulletTrain 的来源委托(delegate)给子类。

例如:

abstract class AbstractTrainFactory<T extends Train> {
    protected abstract T newTrainInstance();
    public abstract T fashionTrainToSpec();
}

abstract class AbstractBulletTrainFactory<T extends BulletTrain>
extends AbstractTrainFactory<T> {
    @Override
    public T fashionTrainToSpec() {
        T theTrain = newTrainInstance();
        theTrain.noseSwoop = noseSwoopSpec;
        return theTrain;
    }
}

class FastBulletTrainFactory
extends AbstractBulletTrainFactory<FastBulletTrain> {
    @Override
    protected FastBulletTrain newTrainInstance() {
        return new FastBulletTrain();
    }
}

关于java - 使用有界泛型类扩展另一个泛型类会产生未知类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26940986/

相关文章:

java - 合并排序错误的问题

java - 同一个 Java 类中的 Try-Catch-Throw

java - Hibernate 中实体集合的陷阱

c# - 如何为 T[]、T[][] 编写重载的泛型扩展方法而不会产生歧义?

android - 无法在 Kryo 中使用泛型字段序列化泛型类

java - 如何通过更改标题(即旋转对象)来避免与边框或彼此之间的碰撞

java - FileReader如何构造FileInputStream和Input Reader?

java - 在运行时创建具有反射和泛型的类的数组

c# - F# 的通用成员约束是否可以在 C# 中使用?

c# - 来自基本类型的操作泛型