在JLS 8, Section 8.4.8.1中有一个声明:
在某些参数化下,通用超类C中的具体方法可以具有 与该类中的抽象方法相同的签名。在这种情况下,具体方法 是继承而抽象方法不是。继承 然后应该考虑从C覆盖其抽象对等方法。
任何人都可以为泛型类提供这种参数化的例子吗?我无法做到。
答案 0 :(得分:2)
也许
public abstract class A<T> {
public abstract void m(T t);
public void m(String s) {}
}
public class B extends A<String> {
}
在这种情况下,B
中的两种方法都是void m(String)
。
答案 1 :(得分:2)
@Roman给出了上述答案,我想再补充一点。如果我们从String to Object
更改方法 m()的参数,则会出现编译错误,因为Generics在Type擦除上工作,因此在类型擦除m(T t) -> will be to m(Object t)
之后,这是编译错误,因为我们不能有两个具有相同名称和签名的方法。请参阅以下编译错误 -
public abstract class A<T> {
public abstract void m(T t); // compilation error: m(T) and m(Object), both method have same erasure
public void m(Object s) {}
}
public class B extends A<Object> {
@Override
public void m(Object o) {
}
}