sách gpt4 ai đã đi

java - 为什么泛型类型具有相同的签名?

In lại 作者:塔克拉玛干 更新时间:2023-11-03 04:47:16 25 4
mua khóa gpt4 Nike

我有以下通用类:

class Or
{
Or (A a) {}
Or (B b) {}
}

为什么我尝试编译它时会出现以下错误:

Or(A) is already defined in Or Or (B b) ^

在我看来,这两个构造函数共享相同的签名,尽管它们具有不同的泛型类型参数。为什么?以及如何解决这个问题?

làm mới

我现在明白了这个问题。编译器需要一种方法来区分这两种类型。添加这样的约束对于我的用例来说是可以的。所以我想补充一个问题:

如何指定A和B这两个类型可以是不同的?

1 Câu trả lời

It seems to me that the two constructors share the same signature although they have different generic type arguments.

他们有。签名是

Or(Object o);

Why?

bởi vìtype erasure Java 中泛型的实现:对泛型类型的引用在使用它们的所有上下文中都被转换为 System.Object;泛型类型只为编译器所知。

And how to work around this problem?

不幸的是,您无法在构造函数中轻松解决此问题。您可以用工厂方法替换重载的构造函数,并赋予不同的名称,例如 OrWithAOrWithB:

// Hide the constructor
private Or(...) {
...
}
// Publish factory methods
public static Or OrWithA(X a) {
return new Or(...);
}
public static Or OrWithB(X a) {
return new Or(...);
}

关于java - 为什么泛型类型具有相同的签名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17445245/

25 4 0
Giấy chứng nhận ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com