java - 扩展泛型类但削弱子类中的泛型绑定(bind)

标签 java generics inheritance

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

我想做的基本上是创建一个类 A具有通用绑定(bind) <T extends SomeType> ,然后创建一个子类 B ,没有通用绑定(bind)(应该允许任何类型)<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(); // ???

关于java - 扩展泛型类但削弱子类中的泛型绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13372624/

相关文章:

c# - 确定字段是否使用通用参数

javascript - 这是在 JavaScript 中定义继承链的 'standard' 方式吗?

arrays - 如何将扩展仅应用于泛型的某些特化?

c# - 避免为具有非限定泛型类型的泛型静态类使用类名

java - 删除 HTML 实体及其内容

java - 数组缺少元素

c++ - 如何用自己的类型实例化父类(super class)模板?

使用 apply 的 JavaScript 继承

git - 如何使用带有 ssh 的 java api 推送到 gitlab

java - 如何使用 websocket 检查消息是否真的在 Netty 中传递?