理论上,子类方法中的输入参数应该等同于或小于超类的输入参数(逆变)。
我想做的基本上是创建一个具有泛型绑定<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)根本没有类型参数。