【发布时间】:2019-06-08 17:36:16
【问题描述】:
我知道类型擦除,但这对我来说没有意义。
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)' 与 '基础'中的'转换(集合)';两种方法都有相同的擦除, 但两者都不会覆盖另一个
我的想法是我们可以覆盖 transform 而不会出现编译器错误。
为什么Derived 中的transform 没有正确覆盖Base 中的transform 方法?我知道这与类型擦除有关,但是。我不明白为什么。
【问题讨论】:
-
需要给Base同样的泛型参数
T,然后在Derived中指定具体参数。 -
这是不允许的!如果允许,可以使用以下代码:
Base instance = new Derived(); Collection<Number> numbers = ...; Collection<Number> transformed = instance.transform(numbers);但正如您所见,您会使用错误的参数调用派生类的转换方法。 -
您在基类中的方法签名表明它允许any T,而不是特定的T。
标签: java generics overriding