我完全明白这个问题方法与类型中的另一个方法具有相同的擦除 https://stackoverflow.com/questions/1998544/method-has-the-same-erasure-as-another-method-in-type以及它的答案。请问有人可以帮我理解下面的内容吗?
努力消化,为什么下面的第二个代码片段会给出编译器错误?
代码1:编译良好
class Parent {
public void set(Collection<Integer> c) { }
}
class Child extends Parent {
public void set(Collection<Integer> c) {}
}
代码 2:编译器错误set
Child 类中的方法。
class Parent {
public void set(Collection<?> c) { }
}
class Child extends Parent {
public void set(Collection<Integer> c) {}
}
编译器错误是
名称冲突:Child 类型的方法 set(Collection) 与类型的 set(Collection) 具有相同的擦除
输入 Parent 但不覆盖它
因为第一个示例中的代码重写了父对象的方法,所以最终在子对象上得到一个 set 方法:
public void set(Collection<Integer> c) {}
这显然没问题。
在第二个示例中,您没有重写超类型上的方法(因为重写方法不是您尝试重写的方法的子签名)。因此,这两种方法必须可以存在于子类型上。
//from parent:
public void set(Collection<?> c)
//from child:
public void set(Collection<Integer> c)
在类型擦除之后,这是不可能的:
//from parent:
public void set(Collection c)
//from child:
public void set(Collection c)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)