我有以下泛型类:
class Or<A,B>
{
Or (A a) {}
Or (B b) {}
}
Run Code Online (Sandbox Code Playgroud)
我尝试编译时为什么会出现以下错误:
Or(A) is already defined in Or
Or (B b)
^
在我看来,两个构造函数共享相同的签名,尽管它们具有不同的泛型类型参数.为什么?以及如何解决这个问题?
更新
我现在明白了这个问题.编译器需要一种方法来区分这两种类型.添加这样的约束对我的用例来说是可以的.所以我想补充一个问题:
如何指定A和B这两种类型可能是不同的?
在我看来,两个构造函数共享相同的签名,尽管它们具有不同的泛型类型参数.
他们是这样.签名是
Or(Object o);
Run Code Online (Sandbox Code Playgroud)
为什么?
由于Java中泛型的类型擦除实现:对泛型类型的引用将转换为System.Object使用它们的所有上下文; 泛型类型只有编译器知道.
以及如何解决这个问题?
不幸的是,您无法在构造函数中轻松解决此问题.你可以用工厂方法代替重载的构造函数,并给予不同的名字,说OrWithA和OrWithB:
// Hide the constructor
private Or(...) {
...
}
// Publish factory methods
public static <X> Or OrWithA(X a) {
return new Or(...);
}
public static <X> Or OrWithB(X a) {
return new Or(...);
}
Run Code Online (Sandbox Code Playgroud)