我正在尝试返回一个对象,该对象应该是IClass的一个实现,其泛型类型是IType的一个实现。
public IClass<IType> createClass()
{
return new ActualClass();
}
我想要返回的实际类扩展了Class(abstract),其泛型类型为ActualType:
public class ActualClass extends Class<ActualType>
抽象Class对象实现IClass接口,并且可以具有扩展IType
的任何类型public abstract class Class<T extends IType> implements IClass<T>
ActualType只是实现了IType接口
public final class ActualType implements IType
我得到&#34;类型不匹配:无法从ActualClass转换为IClass&#34;编译错误。我无法理解为什么,因为ActualClass实现了IClass(间接通过Class),而且ActualType实现了IType。
我如何重新排列它以便它有效?我做错了什么或被误解了?
理想情况下,我仍然希望有一个接口IClass和IType,一个抽象的实现类,然后是一个ActualClass,它扩展了抽象类,并且具有一个已实现IType的特定类型。
答案 0 :(得分:3)
ActualClass
的层次结构如下:
IClass<ActualType>
^
|
Class<ActualType>
^
|
ActualClass
因此,IClass<ActualType>
是ActualClass
的超级类型。但是您的方法的返回类型是IClass<IType>
。即使IType
是ActualType
的超级类型,IClass<IType>
也不是IClass<ActualType>
的超类型,因此它也不是ActualClass
的超类型。< / p>
因此,要么将方法的返回类型更改为IClass<ActualType>
,要么IClass<? extends IType>
。以下应该有效:
public IClass<? extends IType> createClass() {
return new ActualClass();
}
答案 1 :(得分:2)
将createClass
的方法签名更改为:
public IClass<? extends IType> createClass() {
return new ActualClass();
}
它不编译的原因是Generics in Java are not implicitly polymorphic,所以你必须明确表示该方法能够返回由IClass
的未知子集参数化的IType