【发布时间】:2014-04-11 13:53:26
【问题描述】:
我已经阅读了这篇文章here 并试图弄清楚如何使用绑定类型。我试图实现的是一种处理四种不同情况的参数化方法:
- 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");
}
}
编译器抱怨并说了两件事:
-
模棱两可的称呼
方法句柄(Main.D)对于 Main 类型不明确 我猜这个问题是由与问题 2 相同的原因引起的。& I 清楚地将 T 的类型限制为 B 的子类型,因此我认为消除了歧义。
-
相同的擦除句柄
方法句柄(T)与 Main 类型中的另一个方法具有相同的擦除句柄(Main.B) 我的猜测是,这是所有问题的真正原因。 Java 在运行时以某种方式消除了对 I 的限制?但是当我调用 B 类型的方法时,这不会调用注释的方法。
有人可以解释我如何解决问题/区分 B、B&I 和 I 吗?
【问题讨论】:
-
如果你想要最后的所有 3 个
handle方法,你无法修复它。 -
那么还有其他方法吗?
标签: java multiple-inheritance bounded-types