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



理论上,子类方法中的输入参数应该等同于或小于超类的输入参数(逆变)。

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

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

这在java中甚至可能吗,或者从理论上讲是正确的吗?

不,这是不正确的。考虑在 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(); // ???

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

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

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

最新更新