2

我阅读了有关此的所有其他问题,但我不明白为什么在我的情况下会出现类型擦除。我有

public <T extends Aclass&Binterface> boolean test(final T param) {
    ...
}

public boolean test(final Aclass pOtherPPShape) {
    ...
}

方法 test(Aclass) 与 ClassName 类型中的另一个方法具有相同的擦除测试 (Aclass)

我应该如何编写两种对同一个类进行操作但一种具有接口而一种没有接口的方法?(我无法修改 AClass,因为它来自外部库,并且有很多子类型可以使用此代码)

在这种情况下使用 instanceof 是否正确?

编辑:我在碰撞测试中使用它。如果传递的形状是接口的实例,我会得到一个碰撞掩码(带有接口的方法),然后调用“检查器”,如果不是,我想实例化一个虚拟碰撞掩码,它会做一些不同的事情并传递给“检查器”的相同方法(具有 2 个形状和 2 个 collisonmasks 作为参数)

4

1 回答 1

1

您已经认识到问题与类型擦除有关,并且您不能以类型擦除的方式“重载”一个参数(类型擦除 - 您将被模拟)。但是,你说,

泛型类型签名是不同的,为什么会发生冲突?

这两种类型是不同的T extends Aclass&BinterfaceAclass不是吗?

嗯,是的,也不是。虽然实际上它们是不同的,但在类型擦除下它们并不明显**1。一个优秀的资源解释说:“在类型擦除的过程中,编译器用最左边的边界替换类型参数”。在您的情况下是Aclass,这导致了两种方法之间的冲突。

解释表明...

解决方案:形式化combound**2泛型类型声明以建立唯一的最左边界

替换<T extends Aclass&Binterface><T extends AandB>, whereAandB是这样创建的:

  1. interface Ainterface使用Aclass方法签名定义

  2. Aclass implement Ainterface

  3. 定义interface AandB extends Ainterface, Binterface.

或者

你可以使用instanceof.


**1 “因为较长的波长会被大气中的粒子折射”,另一个优秀资源 Duncan Jones 说。

**2 那是compound,因为我无法抗拒这种乐趣:-/

于 2012-07-31T19:49:15.897 回答