Javagenerics方法约束 – 从约束中排除类型以防止擦除问题?
我试图基于类型约束重载方法。 代码看起来像这样:
protected static void addComponent(List factors, T component) { ... } protected static void addComponent(List factors, T conditionalComponent) { .... }
ComponentTemplate
是一个抽象类, ConditionalComponent
是一个接口。 这两种方法可以将组件添加到组件列表中。 在组件实现ConditionalComponent
的情况下,将使用其他方法来确定是否应添加特定组件。 当对象未实现ConditionalComponent
时,将使用完全不同的方法。
问题是这些方法具有相同的擦除(根据RAD,当然拒绝编译)。 有没有办法定义第一个方法,以便它排除任何扩展ComponentTemplate
和ConditionalComponent
对象? 我想象过这样的事情:
protected static void addComponent(List factors, T component) { ... }
但是,当然,这不起作用(它不是有效的语法)。 我正在尝试做什么,或者是否有解决方法?
这是不允许的。 为什么不?
在Java中调用方法时,将使用具有最特定类型签名的方法。
在示例中:
interface A {...} interface B {...} class X extends A, B {...} void f(X); void f(A); void f(B); X x = ... f(x); // calls f(X) f((A)x); // calls f(A) f((B)x); // calls f(B)
我们都知道如何投射来调用我们想要的正确方法。
但在这个例子中
void g(T); //G1 void g(T); //G2 g(x); // calls G1
我们可以调用G1
,但没有重定向就无法调用G2
。 我们不能向A & B
倾斜,只能向A
或B
。
A & B
似乎没有很好地集成到类型系统中(大多数人甚至都不知道它),因此Java在选择要调度到哪个版本的方法时,不会将A
视为与A & B
不同的类型。
更疯狂的例子:
interface A interface B extends A void f(T) void f(T)
这将编译,但你不能调用其中任何一个
B b = new B(){...} f(B); // method reference is ambiguious.