作者热门文章
- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我发现了类似的主题,但过于复杂且不太相同。事情是这样的。这是适用于 1.6 的(最小)代码,但不能用 1.7 javac 编译。
public class Test {
private static class A<T>{};
private static class B{};
private static class C{};
B doSomething(A<B> arg){
return new B();
}
C doSomething(A<C> arg){
return new C();
}
}
在 1.7 上,错误是这样的:
java: name clash: doSomething(Test.A<Test.C>) and doSomething(Test.A<Test.B>) have the same erasure
我理解类型删除以及为什么它是错误的代码。我只是不明白为什么我们的项目中的这段代码可以在 1.6 中编译和运行,而 1.7 却有问题。怎么了?它允许我们这样做是 1.6 编译器中的错误吗?除了重写之外,是否可以让它在 1.7 中工作?
最佳答案
你说得对,在 JLS3 下,这段代码永远不会被编译,这是 1.6 中的一个错误。
在 1.7 版本中,许多底层类型系统都已更新并修复了这个错误,结果是更好的类型处理,但代价是一些向后兼容性问题。
至于让它在 1.7 中运行,我相信重构是您唯一的选择。
关于java - JDK 1.7 打破了向后兼容性? (泛型),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20268978/
我是一名优秀的程序员,十分优秀!