【问题标题】:Abstract and concrete method with same signature in generic class泛型类中具有相同签名的抽象和具体方法
【发布时间】:2016-06-08 20:45:12
【问题描述】:

JLS 8, Section 8.4.8.1中有一句话:

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

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

【问题讨论】:

  • 它在底部的第 244 页上。提供的报价稍作修改以使其更短。

标签: java


【解决方案1】:

也许

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)

【讨论】:

  • 这看起来像是一个合适的例子,我尝试了更复杂的例子,但它们没有奏效:) 谢谢!
【解决方案2】:

@Roman 给出的上述答案是正确的,我想在该答案中再添加一件事。如果我们把方法m()的参数改成String to Object,那么会出现编译错误,因为Generics是在类型擦除上起作用的,所以在类型擦除之后m(T t) -&gt; 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) {
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-26
    • 1970-01-01
    • 2013-08-14
    • 2018-05-12
    • 2014-11-10
    相关资源
    最近更新 更多