我需要在我的子类中实现一种方法
Foo
::
Bar
您可以看到,我的方法将从类型参数中受益:
class Foo {
public abstract void foo();
}
class Bar extends Foo {
private <T> Map<T, List<T>> getStuff() { ... }
@Override
public void foo() {
Map<?, List<?>> stuff = getStuff();
for (Entry<?, List<?>> e : stuff.entrySet()) {
Object key = e.getKey();
List<?> lst= e.getValue();
lst.add(key); // illegal: need ?, got Object
}
}
}
(我也可以使用RAW类型,因为我知道它会起作用,但是我读过的所有内容都说您不应该这样做)
不幸的是,这是非法的 - 我的方法@Override
public <T> void foo() {
Map<T, List<T>> stuff = getStuff();
for (Entry<T, List<T>> e : stuff.entrySet()) {
T key = e.getKey();
List<T> lst= e.getValue();
lst.add(key); // legal!
}
}
在
foo
中与foo()在foo中发生冲突;这两种方法都具有相同的擦除,但都没有覆盖对方”。 this this Gook,鉴于我的类型参数不会更改参数或返回类型。
我的解决方法的丑陋hack直到现在,只需写一个全新的(参数化)方法:
Bar
我有两个问题:为什么将类型参数添加到方法中,以防止其超级类中的未参数化方法?
有一种更好的方法来获得我想要的行为?
请参见
JLS8.4.2
:8.4.2。方法签名