我阅读了有关此的所有其他问题,但我不明白为什么在我的案例中存在类型删除。我有
public <T extends Aclass&Binterface> boolean test(final T param) {
...
}
public boolean test(final Aclass pOtherPPShape) {
...
}
方法 test(Aclass) 与类型 ClassName 中的另一个方法具有相同的删除测试(Aclass)
我应该如何编写两个在同一个类上运行的方法,一个有接口(interface),一个没有? (我无法修改 AClass,因为它来自外部库,并且有很多子类型可以使用此代码)
在这种情况下使用 instanceof 是否正确?
编辑: 我在碰撞测试中使用它。如果传递的形状是接口(interface)的实例,我会得到一个碰撞掩码(使用接口(interface)的方法)然后调用“检查器”,如果不是,我想实例化一个虚拟碰撞掩码来做一些不同的事情并传递给“检查器”的相同方法(具有 2 个形状和 2 个 collisonmasks 作为参数)
最佳答案
您已经认识到问题与类型删除有关, 并且您不能以这种方式“重载”带有类型删除的一个参数 (类型删除 - 你将被模拟)。 但是,你说,
泛型类型签名不同,为什么会发生冲突?
两种类型T extends Aclass&Binterface
和 Aclass
是截然不同的,不是吗?
好吧,是的,不是。虽然实际上它们是不同的,但在类型删除下它们并不不同**1。一个优秀的资源说明:“In the process of type erasure the compiler replaces type parameters by their leftmost bound ”。在你的情况下是 Aclass
,这就导致了两种方法的冲突。
解释表明...
解决方案:形式化组合**2泛型类型声明以建立唯一的最左边界
替换<T extends Aclass&Binterface>
与 <T extends AandB>
, 其中AandB
是这样创建的:
定义
interface Ainterface
与Aclass
方法签名有
Aclass implement Ainterface
定义
interface AandB extends Ainterface, Binterface
.
或
你可以使用instanceof
.
**1 “因为较长的波长会被大气中的粒子折射”,根据 Duncan Jones 的说法,这是另一个优秀的资源。
**2 那是 compound
, 因为我无法抗拒乐趣 :-/
关于java - 方法具有(意外地)与另一个方法相同的删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11747717/