扩展泛型类但削弱子类中的泛型绑定

时间:2012-11-14 03:33:10

标签: java generics inheritance

理论上,子类方法中的输入参数应该比超类的输入参数(逆变)等效或更少限制。

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

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

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

这在Java中是否可行,或者从理论的角度来看是否正确?

2 个答案:

答案 0 :(得分:4)

不,这不正确。考虑在A中声明的方法返回T

abstract class A<T extends SomeType> {

    abstract T foo();
}

静态类型为A的对象应符合该类声明的边界:

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

但是如果B取消了这些界限:

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(); // ???

答案 1 :(得分:0)

你的问题相当令人困惑,主要是因为某些术语的使用不当,但如果我理解正确,下面的例子就像你所描述的那样:

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

因此,根据您的问题,A类的类型参数的上限为CharSequence ,而B类(扩展A)根本没有类型参数。