gpt4 book ai didi

java - 有界类型 : Multiple bounds

转载 作者:太空宇宙 更新时间:2023-11-04 06:53:51 24 4
gpt4 key购买 nike

我读过这篇文章here并试图找出如何使用绑定(bind)类型。我试图实现的是一种处理四种不同情况的参数化方法:

  • T 仅扩展 B
  • T 扩展了 B 和 I(此处为 D)
  • T 仅扩展 I
  • 其他一切

所以这是代码:

public class Main {

public static void main(String... args) {
B b = new B();
D d = new D();
I i = new I() {
};
handle("aaasd");
handle(b);
handle(d); <---- Problem 1
handle(i);
}

public static class B {

}

public static interface I {

}

public static class D extends B implements I {

}


public static <T> void handle(T objT) {
System.out.println("T");
}

private static <T extends B> void handle(T obj) {
System.out.println("B");
}

public static <T extends B & I> void handle(T objT) { <--- Problem 2
System.out.println("B+I");
}

private static <T extends I> void handle(T obj) {
System.out.println("I");
}
}

编译器提示并说了两件事:

  1. 不明确的调用

    The method handle(Main.D) is ambiguous for the type Main I guess the problem is caused by the same cause as Problem number 2. The & I clearly bounds the type of T to a subtype of B AND I thus removing ambiguity in my opinion.

  2. 相同的删除句柄

    Method handle(T) has the same erasure handle(Main.B) as another method in type Main My guess is that this is the real cause for all the problems. Java somehow removes bounding to I during runtime? But when I call the method with type B this doesn't call the annoted method.

有人可以解释一下我如何解决问题/区分 B、B&I 和 I 吗?

最佳答案

Java somehow removes bounding to I during runtime?

不,Java 在运行时删除所有类型信息(反射目的除外),这称为类型删除。

使用边界,编译器可以将代码转换为 handle(Object)handle(B)handle(I),但在 T extends B & I 情况下,编译器会发生冲突。

据我所知,如果没有共同的界限,就无法解决这个问题,例如T 扩展 D 而不是 T 扩展 B & I,其中 D 扩展 B 实现 I 或更改方法名称或添加其他参数。

另一种方法可能是将 B+I 情况中的逻辑添加到 B 或 I 方法中,并检查其中的第二个条件,例如

private static <T extends B> void handle(T obj) {
if( obj instanceof I) {
System.out.println("B+I");
}
else {
System.out.println("B");
}
}

关于java - 有界类型 : Multiple bounds,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23014614/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com