2012-11-14 203 views
1

理论上,子类方法中的输入参数应该等于或小于超类的输入参数(逆变)。扩展泛型类,但弱化子类中的泛型绑定

我想要做的基本上是创建一个类A,有一个通用的结合<T extends SomeType>,但随后创建一个子类B,没有通用的绑定(应该允许任何类型)<T>

class A<T extends SomeType> {....} 

    class B<T> extends A<T extends SomeType> { ..... } 

这是甚至可能在Java或从理论的角度来看是正确的?

+0

B延长A有意义吗? –

回答

4

不,这是不正确的。

abstract class A<T extends SomeType> { 

    abstract T foo(); 
} 

静态类型为A的对象预计将符合由该类声明的界限:

A<?> a = ...; 
SomeType someObject = a.foo(); 

不过,如果B与摒弃考虑A返回T声明的方法这些边界:

abstract class B<T> extends A<T> { } 

class C extends B<String> { 

    @Override 
    String foo() { 
     return "foo"; 
    } 
} 

我们有乱:

A<?> a = new C(); 
SomeType someObject = a.foo(); // ??? 
+0

噢好吧,从来没有想过做这样的滥用,但我可以理解为什么它不可能实现。谢谢!! – MikioBo

0

你的问题是相当混乱,多为不正确使用的一些术语,但如果我理解正确的话,下面的例子看起来像你描述你想做的事:

class A<T extends CharSequence> { } 
class B extends A<String> { } 

所以,根据你的问题,类A有一个类型参数,CharSequence的上界为,而类B(它扩展了A)完全没有类型参数。