gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:47:16 25 4
gpt4 key购买 nike

我有以下通用类:

class Or<A,B>
{
Or (A a) {}
Or (B b) {}
}

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

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

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

更新

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

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

最佳答案

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

他们有。签名是

Or(Object o);

Why?

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

And how to work around this problem?

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

// 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(...);
}

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com