【问题标题】:How to cast generic Class type into an another generic Class type in Java如何在 Java 中将泛型 Class 类型转换为另一个泛型 Class 类型
【发布时间】:2018-08-24 08:22:37
【问题描述】:

这就是我想要的:

interface A {}
abstract class B implements A {}
class C extends B { /*few fields*/ }
class D extends B { /*few different fields*/ }

public void doSomething(Class<A> clazz) {
    if(clazz.isAssignableFrom(B)) {
        doSomethingElse((Class<? extends B>)clazz); // casting is good, but cannot pass this way to doSomethingElse
    }
}

public <T extends B> void doSomethingElse(Class<T> clazz) {
    if(clazz.isAssignableFrom(C)) {
        // do something with C fields
    } else if(clazz.isAssignableFrom(D)) {
        // do something with D fields
    }
}

但显然我不能以这种方式转换类类型。

有办法吗?我很好奇……

谢谢!

【问题讨论】:

  • 由于 B 是一个实际类型,没有什么能阻止你将 B.class 传递给 doSomethingElse 而不是尝试强制转换 clazz。即doSomethingElse(B.class)
  • 示例不正确,我将其更新为 C 类和 D 类
  • 它闻起来有点像设计缺陷...您实际上想对这些字段做什么?您还如何访问这些字段?你会通过反射创建一个新实例吗?老实说,给出适当的答案有点太模糊了......
  • 您能具体说明您的问题是什么吗?你提到的有问题的演员表似乎对我有用。
  • 是的,演员阵容基本上很好,现在我明白了,但我不能通过 doSomethingElse 方法

标签: java class generics casting


【解决方案1】:

首先,Class&lt;A&gt; 类型的值只能是确切类A 的类对象,不能是任何其他类。其他一些类B 的类对象将是Class&lt;B&gt;,而Class&lt;B&gt; 绝不是Class&lt;A&gt; 的子类型。您可能需要一个 Class&lt;? extends A&gt; 参数。

其次,您对.isAssignableFrom() 的使用似乎倒退了(除了它在语法上无效,因为B 不是一个有效的表达式)。 clazz.isAssignableFrom(B.class) 表示clazz 表示的类是B 的超类,在这种情况下,将clazz 转换为Class&lt;? extends B&gt; 是没有意义的。你可能想要B.class.isAssignableFrom(clazz)。

一旦您进行了上述第一次更改(make clazz type Class&lt;? extends A&gt;),转换将编译,尽管它是未经检查的转换。如果您不想要未经检查的演员表,而不是 (Class&lt;? extends B&gt;)clazz,您可以使用 clazz.asSubclass(B.class)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-09
    • 1970-01-01
    • 2014-08-02
    • 2021-12-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多