我有以下结构:
class Base{}
class Extension1 extends Base{}
class Extension2 extends Base{}
abstract class AbstractClazz<T extends Base>{}
class Clazz1 extends AbstractClazz<Extension1>{}
class Clazz2 extends AbstractClazz<Extension2>{}
<T extends Base> AbstractClazz<T> method(boolean returnClass1){
if (returnClass1){
return new Clazz1();
}
return new Class2();
}
但是,我的编译器给我一个错误,指出“无法从 Clazz1 转换为 AbstractClazz”。 我不知道为什么会发生这种情况。据我了解,
Clazz1
和Clazz2
满足AbstractClazz<T extends Base>
实例的要求,因为Clazz1
和Clazz2
是AbstractClazz
的实现,其中泛型类型是Base
的子类,这正是 AbstractClazz<T extends Base>
所期待的。
我该如何解决这个问题?
注意:我的代码是使用 Java 8 编写的。
<T extends Base> AbstractClazz<T> method(boolean returnClass1){
像
<T extends Base>
这样的类型参数在很多方面都像 boolean returnClass1
:调用者选择它们。
例如,调用者可以写
class MyRandomExtensionOfBase extends Base{}
AbstractClazz<MyRandomExtensionOfBase> thingy = Foo.<MyRandomExtensionOfBase>method(true);
...这应该有效。
那不是你所拥有的。 你有一个返回
AbstractClazz<? extends Base>
的函数,返回 some AbstractClazz<T>
对于某些 T extends Base
由 method
的实现决定。
您必须返回该类型才能进行类型检查。