【问题标题】:Error when returning interface with generic type返回泛型类型的接口时出错
【发布时间】:2015-05-20 00:40:25
【问题描述】:

我正在尝试返回一个对象,该对象应该是 IClass 的实现,其泛型类型是 IType 的实现。

public IClass<IType> createClass()
{
    return new ActualClass();
}

我要返回的实际类继承自Class(抽象),泛型类型为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

我在编译时收到“类型不匹配:无法从 ActualClass 转换为 IClass”错误。我不明白为什么,因为 ActualClass 实现了 IClass(间接通过 Class)而 ActualType 实现了 IType。

如何重新排列它以使其正常工作?我做错了什么或误解了什么?

理想情况下,我仍然想要一个接口 IClass 和 IType,一个抽象实现 Class,然后是一个 ActualClass,它扩展了抽象 Class 并具有实现了 IType 的特定类型。

【问题讨论】:

    标签: java generics interface


    【解决方案1】:

    ActualClass的层次结构是这样的:

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

    所以,IClass&lt;ActualType&gt;ActualClass 的超类型。但是你的方法的返回类型是IClass&lt;IType&gt;。即使ITypeActualType的超类型,IClass&lt;IType&gt;也不是IClass&lt;ActualType&gt;的超类型,因此也不是ActualClass的超类型。

    所以,要么将方法的返回类型更改为IClass&lt;ActualType&gt;,要么更改为IClass&lt;? extends IType&gt;。以下应该有效:

    public IClass<? extends IType> createClass() {
        return new ActualClass();
    }
    

    【讨论】:

    • 谢谢 - 这确实有效。但是把 而不是 似乎不太正确(该函数的结果通过不同的地方传递)。我担心这个是不是很傻。另一个似乎可行的解决方案是将抽象类更改为: public abstract class Class implements IClass 这也会导致问题吗?
    【解决方案2】:

    createClass的方法签名改为:

    public IClass<? extends IType> createClass() {
        return new ActualClass();
    }
    

    它不编译的原因是Generics in Java are not implicitly polymorphic,所以你必须明确指出该方法能够返回由IType的未知子集参数化的IClass

    【讨论】:

      猜你喜欢
      • 2013-04-03
      • 1970-01-01
      • 2016-10-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多