返回具有泛型类型的接口时出错

时间:2015-03-17 14:21:44

标签: java generics interface

我正在尝试返回一个对象,该对象应该是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的特定类型。

2 个答案:

答案 0 :(得分:3)

ActualClass的层次结构如下:

IClass<ActualType>
       ^
       |
Class<ActualType>
       ^
       |
   ActualClass

因此,IClass<ActualType>ActualClass的超级类型。但是您的方法的返回类型是IClass<IType>。即使ITypeActualType的超级类型,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