java - 将通用子类型类信息传递给 Java 中的父类(super class)

标签 java generics inheritance abstract-class

我长期以来在 Java 中使用一个习惯用法,用于在其(通常是抽象的)祖先类的方法中使用(非抽象)类的类信息(不幸的是我找不到这个名称模式):

public abstract class Abstract<T extends Abstract<T>> {
    private final Class<T> subClass;

    protected Abstract(Class<T> subClass) {
        this.subClass = subClass;
    }

    protected T getSomethingElseWithSameType() {
        ....
    }
}

其子类的一个例子:

public class NonGeneric extends Abstract<NonGeneric> {
    public NonGeneric() {
        super(NonGeneric.class);
    }
}

但是,我在定义 Abstract 的子类时遇到了问题它有自己的通用参数:

public class Generic<T> extends Abstract<Generic<T>> {
    public Generic() {
        super(Generic.class);
    }
}

这个例子是不可编译的;同样,不可能使用例如指定泛型类型。 Generic<T>.class甚至使用像 Generic<?> 这样的通配符.

我还尝试替换通用类型的声明 T在父类(super class)中为 ? extends T ,但这也不可编译。

有什么方法可以使这种模式与通用基类一起工作?

最佳答案

传递 Class<T> 实例的“模式”(成语) (通常对构造函数)正在使用 Class Literals as Runtime-Type Tokens , 并用于保留对泛型类型的运行时引用,否则将被删除。

解决方案是首先更改绑定(bind)到的 token 类:

Class<? extends T>

然后像对父类(super class)所做的那样对通用子类提出类似的要求;让具体类传递类型标记,但您可以将其正确键入为参数:

这些类在没有转换或警告的情况下编译:

public abstract class Abstract<T extends Abstract<T>> {
    private final Class<? extends T> subClass;

    protected Abstract(Class<? extends T> subClass) {
        this.subClass = subClass;
    }
}

public class NonGeneric extends Abstract<NonGeneric> {
    public NonGeneric() {
        super(NonGeneric.class);
    }
}

public class Generic<T> extends Abstract<Generic<T>> {
    public Generic(Class<? extends Generic<T>> clazz) {
        super(clazz);
    }
}

最后在具体类中,如果您将用法声明为它自己的类,则它不需要在任何地方进行强制转换:

public class IntegerGeneric extends Generic<Integer> {
    public IntegerGeneric() {
        super(IntegerGeneric.class);
    }
}

我还没有想出如何创建 Generic 的实例(匿名与否)没有类型转换:

// can someone fill in the parameters without a cast?
new Generic<Integer>(???);     // typed direct instance
new Generic<Integer>(???) { }; // anonymous

我不认为这是可能的,但我欢迎以其他方式展示。

关于java - 将通用子类型类信息传递给 Java 中的父类(super class),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19312641/

相关文章:

java - 为什么不应该扩展 JFrame 和其他组件?

java - radio 组不工作和垂直对齐android

java - 我如何定义这个泛型类来返回这种泛型对象?

java - 不常见泛型类型的接口(interface)列表

scala - 通用微风向量法

javascript - 从子类更改父类的静态方法

java - SOAP 客户端对 JAVA 中给定 WSDL 的奇怪响应

Perl:如何确保从基类内部访问时调用重写的方法

Python在父类中使用派生类的方法?

java - 无需按回车即可通过 telnet 发送数据