方法(意外地)具有与另一种方法相同的擦除

时间:2012-07-31 19:37:53

标签: java generics compiler-errors instanceof type-erasure

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

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

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

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

我应该如何编写两个在同一个类上运行的方法,但是一个有接口而另一个没有呢? (我不能修改AClass,因为它来自外部库,并且有很多子代码,这些代码应该可以使用)

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

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

1 个答案:

答案 0 :(得分:1)

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

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

两种类型T extends Aclass&BinterfaceAclass是截然不同的,不是吗?

嗯,是的,不是。虽然实际上它们是截然不同的,但是在类型擦除下它们并不是明显的 ** 1。一个很好的资源解释说:“In the process of type erasure the compiler replaces type parameters by their leftmost bound”。在你的情况下是Aclass,这导致了两种方法之间的冲突。

解释表明......

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

<T extends Aclass&Binterface>替换为<T extends AandB>,其中创建AandB

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

  2. Aclass implement Ainterface

  3. 定义interface AandB extends Ainterface, Binterface

  4. 或者

    您可以使用instanceof


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

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