【发布时间】:2019-09-15 22:59:11
【问题描述】:
我有一个类X,它有以下方法:
public <T> List<T> g(List<T> l) {…}
我还有一个类 Y 扩展类 X 并具有以下方法:
public <T> List<T> g(List<List<T>> l) {…}
据我了解,在类型擦除过程之后,它们都具有相同的原始类型。为什么 Java 不将 Y::g 视为 X::g 的覆盖方法并且无法编译代码?如果在g 中我们有ArrayList 而不是List?
【问题讨论】:
-
IIRC 确实具有相同的原始类型,但类型擦除更多的是运行时的事情,而不是编译时的事情。如果明天没有答案,我会写一个正确的答案。
-
当你不覆盖它们时,为什么要把这两种方法都视为被覆盖?仅仅因为类型将在编译期间被删除并不意味着它们永远不会被考虑。
-
你能提供你的完整代码吗?这不适合我。 ideone.com/bfsDKD
-
@k5_ 就像 OP 说的那样。
-
当我尝试按照您所说的操作时,我得到了您所期望的确切错误(它们具有相同的擦除,但不会相互覆盖)。请出示您的完整代码。 (假设你问为什么你没有得到这个编译错误 - 我看到你可以用两种相反的方式阅读你的问题 - 请澄清)
标签: java type-erasure raw-types