想象一下以下类层次结构:
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
中您无法确定 T
是 BulletTrain
而不是某个子类其中。
例如,如果我这样做会怎样:
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/