java - 方法具有(意外地)与另一个方法相同的删除

标签 java generics compiler-errors instanceof type-erasure

我阅读了有关此的所有其他问题,但我不明白为什么在我的案例中存在类型删除。我有

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&BinterfaceAclass是截然不同的,不是吗?

好吧,是的,不是。虽然实际上它们是不同的,但在类型删除下它们并不不同**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是这样创建的:

  1. 定义 interface AinterfaceAclass方法签名

  2. Aclass implement Ainterface

  3. 定义 interface AandB extends Ainterface, Binterface .

你可以使用instanceof .


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

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

关于java - 方法具有(意外地)与另一个方法相同的删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11747717/

相关文章:

java - Apache Tiles 3 JSP 异常

java - 如何检测 JavaFX 中完成的调整大小操作?

java - 在 java 中将字符串转换为 oracle.sql.clob?

Delphi:OleVariant 和泛型

c# - 绑定(bind)匿名类型以创建 BindingList

java - 编译时IntelliJ无法在同一个包中找到类

java - 无法解析特定符号

compiler-errors - 更换计算机后,MPLABX Project停止编译

java - JPA 和 JSON 运算符 native 查询

swift - 无法覆盖泛型类的子类中的初始化程序