为什么将这两种方法放在同一个类中是不合法的?
class Test{
void add(Set<Integer> ii){}
void add(Set<String> ss){}
}
Run Code Online (Sandbox Code Playgroud)
我明白了 compilation error
方法add(Set)具有与Test类型中的另一种方法相同的擦除add(Set).
虽然我可以解决它,但我想知道为什么javac不喜欢这个.
我可以看到,在许多情况下,这两种方法的逻辑非常相似,可以用一个方法代替
public void add(Set<?> set){}
Run Code Online (Sandbox Code Playgroud)
方法,但情况并非总是如此.
如果你想要有两个constructors接受这些参数的话,这是非常烦人的,因为那时你不能只改变其中一个的名字constructors.
我发现了类似的主题,但过于复杂,并不完全相同.事情就是这样.这是(最小)代码,它在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();
}
}
Run Code Online (Sandbox Code Playgroud)
在1.7上错误是这样的:
java: name clash: doSomething(Test.A<Test.C>) and doSomething(Test.A<Test.B>) have the same erasure
Run Code Online (Sandbox Code Playgroud)
我理解类型擦除以及为什么它是错误的代码.我只是不明白为什么我们可以在我们的项目中编译和运行1.6中的代码,当1.7有问题时.怎么了?这是1.6编译器中的一个错误,它允许我们这样做吗?是否有可能使其在重写以外的1.7中工作?