泛型类中具有相同签名的抽象具体方法

时间:2016-06-08 10:58:40

标签: java

JLS 8, Section 8.4.8.1中有一个声明:

  

在某些参数化下,通用超类C中的具体方法可以具有   与该类中的抽象方法相同的签名。在这种情况下,具体方法   是继承而抽象方法不是。继承   然后应该考虑从C覆盖其抽象对等方法。

任何人都可以为泛型类提供这种参数化的例子吗?我无法做到。

2 个答案:

答案 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) {
    }
}