我有代码,其中方法覆盖List<>
个参数
RetrunType1 func(List<Type1> arg);
ReturnType2 func(List<Type2> arg);
和Type1!= Type2,但该代码在jdk1.6.0_45上编译并正常工作。我知道这个样本没有编译和工作。我怎么能理解这个?
答案 0 :(得分:4)
这是由于type erasure。泛型类型参数不会遵循字节代码,因此如果您建议的重载是合法的,则最终会在字节代码中出现名称冲突:
ReturnType1 func(List arg);
ReturnType2 func(List arg);
解决方案是为函数使用不同的名称。
它在Java 6中起作用的原因是由于{7}在Java 7中已得到修复。
答案 1 :(得分:0)
这里的问题是类型擦除,您可以阅读here。但是,简短版本是Java编译器将删除泛型参数,以使字节代码与以前的Java版本兼容。所以这两种方法都有签名
RetrunType1 func(List arg);
ReturnType2 func(List arg);
因此对于Java来说,这些功能看起来几乎相同。