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

Java 方法(意外地)具有与另一个方法相同的擦除,java,generics,compiler-errors,instanceof,type-erasure,Java,Generics,Compiler Errors,Instanceof,Type Erasure,我阅读了所有关于这个的其他问题,但我不明白为什么在我的案例中会有类型擦除。我有 public <T extends Aclass&Binterface> boolean test(final T param) { ... } public boolean test(final Aclass pOtherPPShape) { ... } 公共布尔测试(最终T参数){ ... } 公共布尔测试(最终Aclass pOtherPPShape){ ... } 方

我阅读了所有关于这个的其他问题,但我不明白为什么在我的案例中会有类型擦除。我有

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

public boolean test(final Aclass pOtherPPShape) {
    ...
}
公共布尔测试(最终T参数){
...
}
公共布尔测试(最终Aclass pOtherPPShape){
...
}
方法测试(Aclass)与类型ClassName中的另一个方法具有相同的擦除测试(Aclass)

我应该如何编写在同一个类上运行的两个方法,一个有接口,另一个没有接口?(我无法修改AClass,因为它来自外部库,并且有许多子类型,这段代码应该使用这些子类型)

在这种情况下使用instanceof正确吗

编辑:
我在碰撞测试中使用它。如果传递的形状是接口的实例,我会得到一个collisionmask(带有接口的一个方法),然后调用“checker”,如果不是,我想实例化一个虚拟的collisionmask,它执行一些不同的操作,并传递给“checker”的同一个方法(该方法的参数为2个形状和2个CollisonMask)

您已经认识到问题在于类型擦除, 而且你不能在一个参数上用类型擦除的方式“重载” (键入擦除-您将被同化)。 但是,你说

泛型类型签名是不同的,为什么会发生冲突? 这两种类型
T扩展了Aclass&Binterface
Aclass
是不同的,不是吗

好吧,是和否。虽然事实上它们是不同的,但在类型擦除下它们不是不同的**1。一个优秀的资源可以解释:“。在您的案例中是
Aclass
,这导致了两种方法之间的冲突

这一解释表明

解决方案:将combound**2泛型类型声明形式化,以建立唯一的最左侧绑定 将
替换为
,其中创建了
a和

  • 使用
    Aclass
    方法签名定义
    interface

  • Aclass实现Ainterface

  • 定义接口A和B扩展到接口B接口
  • 或 您可以使用
    instanceof


    **1“因为较长的波长被大气中的粒子折射”,另一个极好的资源是邓肯·琼斯


    **2那将是复合的,因为我无法抗拒乐趣:-/

    你想在这里实现什么?你能删掉你想做的事情吗?定义第二个方法
    公共布尔测试(最终的T参数)
    怎么样?它们仍然会有相同的擦除。@RichardSitze我编辑了问题OK,但是为什么会发生类型擦除?编译器不知道什么时候编译代码,类是否是Binterface的实例吗?一个以类作为参数的方法和一个同时实现接口的类被以同样的方式对待?每次我必须使用java泛型时,都会感觉它们在收缩。。顺便说一句,谢谢,最后我选择使用instanceof check:更简单、更可读code@RichardSitze因为较长的波长被大气中的粒子折射;-)@邓肯琼斯:谢谢,我已经更新了我的回复,包括你的见解@现在,我想,我有了一个关于为什么的最终答案