java – 为什么泛型类型具有相同的签名?
发布时间:2020-12-14 23:55:13 所属栏目:Java 来源:网络整理
导读:我有以下泛型类: class OrA,B{ Or (A a) {} Or (B b) {}} 我尝试编译时为什么会出现以下错误: Or(A) is already defined in Or Or (B b) ^ 在我看来,两个构造函数共享相同的签名,尽管它们具有不同的泛型类型参数.为什么?以及如何解决这个问题? 更新 我现
我有以下泛型类:
class Or<A,B> { Or (A a) {} Or (B b) {} } 我尝试编译时为什么会出现以下错误: Or(A) is already defined in Or Or (B b) ^ 在我看来,两个构造函数共享相同的签名,尽管它们具有不同的泛型类型参数.为什么?以及如何解决这个问题? 更新 我现在明白了这个问题.编译器需要一种方法来区分这两种类型.添加这样的约束对我的用例来说是可以的.所以我想补充一个问题: 如何指定A和B这两种类型可能是不同的? 解决方法
他们是这样.签名是 Or(Object o);
由于Java中7000泛型的实现:对泛型类型的引用在使用它们的所有上下文中都被转换为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(...); } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |