繁体   English   中英

使用类型参数覆盖泛型方法时的编译错误

[英]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)

然后它不会执行所需的操作:它不接受任何类型的集合元素,它只接受特定类型的元素。 因此它不会覆盖超类方法

通常,在子类中定义一个方法没有问题,该方法不会覆盖超类中的方法:您可以在子类中定义超类中不存在的新方法。 但是由于类型擦除,你不能继续使用这两种方法,因为它们具有相同的签名。 因此,编译器不允许您这样做。

BaseDerived不是一般类和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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM