我发现了类似的主题,但过于复杂且不完全相同。事情就是这样。这是(最小的)代码,在 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 中工作?
- JDK1.6 javac版本:1.6.0_43
- JDK1.7 javac版本:1.7.0_25