【问题标题】:rawtypes compiler warning on generic array creationrawtypes 编译器警告泛型数组创建
【发布时间】:2016-07-04 13:39:47
【问题描述】:

我明白,不能在 java 中创建泛型类数组,例如

  private static final Class<String>[] ARGUMENT_TYPE = new Class<String>[]{String.class};

所以我使用了原始类型:

  private static final Class[] ARGUMENT_TYPE = new Class[]{String.class};

但是现在java编译器报错了

警告:[rawtypes] 发现原始类型:类

private static final Class[] ARGUMENT_TYPE = new Class[]{String.class};

除了SuppressWarnings,还有什么办法可以对编译器说:“闭嘴,我得按照你自己的规范来做!”

【问题讨论】:

  • 为什么不使用List&lt;Class&lt;String&gt;&gt;?数组和泛型不能很好地结合起来……顺便问一下:Class&lt;String&gt; 有什么目的?为什么不Class&lt;?&gt;
  • 因为我知道我有Class&lt;String&gt;。使用? 似乎很奇怪。
  • 我们使用数组是因为第 3 方库需要 Class[]
  • 我认为奇怪的是Class&lt;String&gt; 应该只有一个实例,那么为什么会有一个包含许多条目的数组都应该指向同一个对象呢?您确定您的第 3 方库不会期待一个普通的旧 String[] 吗?

标签: java generics javac


【解决方案1】:

我不太确定您打算如何使用这个静态数组。一些额外的上下文会很好。

这个怎么样?

private static final Class<?>[] ARGUMENT_TYPE = new Class<?>[]{String.class, Int.class};

【讨论】:

  • 这看起来完全像预期的用途。但同样,? 对我来说看起来很奇怪 :( 为什么地球上的编译器强迫我写它?
  • 抱歉,正如您已经在示例代码中看到的那样,现在可以为不同的类添加 Class 对象。这不是您所要求的 (Class&lt;String&gt;[])。
  • @Nikem,我认为编译器只是确保您打算使用泛型而不指定类型。这是一种忽略警告指令的简写。像使用普通类一样使用泛型类而没有明确告诉编译器这是您想要的,这是您犯了错误的危险信号。当然,在这种情况下,仅使用一组未知的 Class 对象才有意义,或者您的数组只能包含一个类对象,这将违背数组的目的。但我认为让编译器变得非常聪明将是一项艰巨的任务。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-01-02
  • 1970-01-01
  • 1970-01-01
  • 2010-10-20
  • 1970-01-01
  • 2011-05-09
相关资源
最近更新 更多