类型擦除返回类型冲突

时间:2016-04-08 18:30:33

标签: java generics inheritance type-erasure

采用以下示例:

class A
{
}

class B extends A
{
}

class MyParent
{
    private A _a;

    public A getMyValue()
    {
        return _a;
    }
}

class MyChild extends MyParent
{
    @Override
    public B getMyValue()
    {
        return (B)super.getMyValue();
    }
}

为什么前一个有效,但以下不是:

class MyChild extends MyParent
{
    @Override
    public <T extends B> T getMyValue()
    {
        return (T)super.getMyValue();
    }
}

我认为自T扩展B以来,由于类型擦除,它不会导致与父getMyValue()实现冲突;但是,似乎情况并非如此。我得到一个错误,说他们都有相同的删除。

澄清为什么我认为它们不应该发生冲突:T extends B应始终至少B或其任何子类。 B继承自A,因此可分配给A类型。

有人可以为我解决此问题吗?有没有办法解决这个问题,不需要更改A班级或MyParent班级(根据我的要求)?

查看:https://docs.oracle.com/javase/tutorial/java/generics/genTypes.html它指出我的示例应该解析的删除是B,而不是A进一步让我感到困惑。

此外,如果我将MyChild类更改为以下内容:

class MyChild<T extends B> extends MyParent
{
    @Override
    public T getMyValue()
    {
        return (T)super.getMyValue();
    }
}

有效!

在方法与类级别上如何解决擦除问题有什么不同?

0 个答案:

没有答案