采用以下示例:
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();
}
}
有效!
在方法与类级别上如何解决擦除问题有什么不同?