为什么在同一个类中有以下两个方法是不合法的?
class Test{
void add(Set<Integer> ii){}
void add(Set<String> ss){}
}
我得到编译错误
方法add(Set)与类型Test中的另一个方法具有相同的擦除添加(Set)。
虽然我可以绕过它,但我想知道为什么javac不喜欢这样。
我可以看到,在许多情况下,这两个方法的逻辑非常相似,可以用一个方法来代替
public void add(Set<?> set){}
方法,但情况并非总是如此。
如果你想有两个接受这些参数的构造函数,这是非常烦人的,因为你不能只改变其中一个构造函数的名字。
当我试图写一些类似这样的东西时,我遇到了这个问题:
Continuable<T> callAsync(可调用的<T> code) {....}
而且
Continuable<Continuable<T>> callAsync(可调用<Continuable<T>> veryAsyncCode){…}
它们成为编译器的2个定义
Continuable<> callAsync(Callable<> veryAsyncCode){…}
类型擦除字面上的意思是从泛型中擦除类型参数信息。
这是非常恼人的,但这是Java在一段时间内的一个限制。
对于构造函数的情况,可以做的不多,例如在构造函数中有2个新的子类专门使用不同的参数。
或者使用初始化方法…(虚拟构造函数?)
对于类似的操作方法,重命名会有所帮助,比如
class Test{
void addIntegers(Set<Integer> ii){}
void addStrings(Set<String> ss){}
}
或者使用一些更具描述性的名称,用于oyu情况的自文档化,如addNames和addIndexes等。