【问题标题】:Class object type parameterization in JavaJava中的类对象类型参数化
【发布时间】:2009-06-23 21:06:31
【问题描述】:

假设如下对象结构:

class Super {}

class SubA extends Super {}
class SubB extends Super {}

我希望能够有一个变量来保存我的任何一个子类的类对象。我觉得应该这样做:

Class<Super> classObj;

然后,我希望能够像这样:

classObj = SubA.class;

或:

classObj = SubB.class;

但这不起作用。我收到以下错误:

Type mismatch: cannot convert from Class<SubA> to Class<Super>

任何想法为什么?我需要解决什么问题?

【问题讨论】:

  • 是否有理由需要存储变量而不是在需要时使用 getClass()?
  • 原因是我在工厂中使用枚举类型。工厂方法采用枚举之一,并实例化适当的类。枚举中还存储了其他东西,所以至少对我来说这似乎是有意义的。

标签: java generics reflection


【解决方案1】:

你需要一个有界通配符

Class<? extends Super> classObj;

请参阅 Java 教程中关于 wildcards 的课程。

【讨论】:

    【解决方案2】:

    正如 mmyers 指出的那样,您可以使用通配符。

    作为替代方案,您可以让类实现一个通用接口,然后通过该接口访问它们。

    【讨论】:

    • 别介意我;我只是保留一个(粗略的)连续拼错我名字的人。我一个月前才开始,我已经 17 岁了。其中之一是杰夫·阿特伍德——我几乎有点出名了!
    • 啊,对不起,情况已经解决了。
    • 没问题;我现在已经习惯了。 (我哥哥曾经收到一封写给他的信,只是他们三个名字都拼错了。他最终克服了。)
    【解决方案3】:

    试试这个(编译失败):

    public class ListCopy {
      public static void main(String[] args) {
        List<String> stringList = new ArrayList<String>();
        List<Object> objectList = stringList;
      }
    }
    

    即使 String 扩展了 Object,这也将无法编译。 Java 的东西不是协变的——类型参数被删除了,所以编译器不知道运行时会有什么。

    类也一样。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-09-29
      • 1970-01-01
      • 2012-02-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多