![](/img/trans.png)
[英]Compilation error while overriding abstract enum method with generic return type
[英]Compilation error when overriding a generic method with a type parameter
我知道类型擦除但这对我没有意义。
class Base{
public <T> Collection<T> transform(Collection<T> list)
{
return new ArrayList<T>();
}
}
和
public class Derived extends Base {
@Override // compilation error
public Collection<CharSequence> transform(Collection<CharSequence> list) {
return new HashSet<CharSequence>();
}
}
我的IDE中生成错误:
'Derived'中的'transform(Collection)'与'Base'中的'transform(Collection)'冲突; 两种方法都有相同的擦除,但都没有覆盖另一种方法
我的想法是我们可以在没有编译器错误的情况下覆盖transform
。 为什么Derived
中的transform
没有正确覆盖Base中的方法transform
? 我知道这与类型擦除有关 。 我不明白为什么。
基类中方法的签名:
<T> Collection<T> transform(Collection<T> list)
说:“我将接受任何类型元素的集合,并返回相同类型元素的集合。
通过Liskov替换原则,任何实现此方法的子类都必须这样做。 特别是,它必须接受具有任何类型元素的集合。
如果您尝试使用方法覆盖它:
Collection<CharSequence> transform(Collection<CharSequence> list)
然后它不会执行所需的操作:它不接受任何类型的集合元素,它只接受特定类型的元素。 因此它不会覆盖超类方法
通常,在子类中定义一个方法没有问题,该方法不会覆盖超类中的方法:您可以在子类中定义超类中不存在的新方法。 但是由于类型擦除,你不能继续使用这两种方法,因为它们具有相同的签名。 因此,编译器不允许您这样做。
Base
和Derived
不是一般类和Collection<T>
在Base
无关与Collection<CharSequence>
在Derived
-他们之间有没有什么联系-一个错误,因此!
您可以按如下方式修复它:
class Base<T> {
public Collection<T> transform(Collection<T> list) {
return new ArrayList<>();
}
}
class Derived extends Base<CharSequence> {
@Override
public Collection<CharSequence> transform(Collection<CharSequence> list) {
return new HashSet<>();
}
}
否则,有效覆盖将是:
class Derived extends Base {
@Override
public <T> Collection<T> transform(Collection<T> list) {
return new HashSet<>();
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.