将通用子类型类信息传递给Java中的超类

语言学家:

我长期以来一直在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);
    }
}

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

我还尝试将超类T中的泛型类型声明替换? extends T,但这也不可编译。

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

波西米亚风格:

传递Class<T>(通常传递给构造函数的)实例的“模式”(惯用语)使用Class Literals作为Runtime-Type Tokens,并用于保留对泛型类型的运行时引用,否则将对其进行擦除。

解决方案是首先将令牌类更改为绑定到:

Class<? extends T>

然后对通用子类提出与超级类类似的要求;让具体类传递类型标记,但是您可以将其正确地作为参数输入:

这些类无需强制转换或警告即可编译:

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

我认为这是不可能的,但我欢迎其他方式的出现。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在java中,我们可以将超类Object传递给子类引用吗?

将子类传递给方法,但将超类作为参数?

Java:将通用类型传递给另一个通用类型类

将超类对象作为参数传递给子类构造函数(java)

将参数传递给超类构造函数,而不必在子类构造函数中重复

Java在超类方法中返回不带通用参数的子类

将超类传递到需要子类的方法中

将信息从 CKRecord 传递给用户定义的类类型

从 Java 中超类类型的 ArrayList 调用子类方法

类类型引用未在Java通用类或方法中传递

将强制数据传递给Kotlin中的超类

将属性从父类传递给子类

将Seq [String]传递给超类

将对象传递给Java中的超类

将超类作为参数传递给期望子类的方法

如何将超类对象传递给子类构造函数?

将子类的ArrayList传递给采用超类的ArrayList的构造函数?

将通用<TObject>类传递给表单

如何在超类方法中访问子类属性,而不将其传递给

将类型参数作为类型参数的类传递给Java中的泛型方法

将类的子类作为类型参数传递(类型参数是子类)

将基类传递给继承超类的函数委托

打字稿将类型传递给通用子类

子类java中的“重写”超类成员

如何将类类型传递给kotlin中的函数?

通过Dart中的子类参数传递超类对象时没有类型错误

使用JAXB将子类实例作为超类传递

传递和访问已传递到需要其超类型的类构造函数中的子类型的值和函数

我可以将基类类型作为通用参数传递给接口吗