Javagenerics方法约束 – 从约束中排除类型以防止擦除问题?

我试图基于类型约束重载方法。 代码看起来像这样:

protected static  void addComponent(List factors, T component) { ... } protected static  void addComponent(List factors, T conditionalComponent) { .... } 

ComponentTemplate是一个抽象类, ConditionalComponent是一个接口。 这两种方法可以将组件添加到组件列表中。 在组件实现ConditionalComponent的情况下,将使用其他方法来确定是否应添加特定组件。 当对象未实现ConditionalComponent时,将使用完全不同的方法。

问题是这些方法具有相同的擦除(根据RAD,当然拒绝编译)。 有没有办法定义第一个方法,以便它排除任何扩展ComponentTemplateConditionalComponent对象? 我想象过这样的事情:

  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倾斜,只能向AB

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.