【问题标题】:What does <?> stand for in Java? [duplicate]<?> 在 Java 中代表什么? [复制]
【发布时间】:2012-09-21 22:47:21
【问题描述】:

可能重复:
Java Generics

在 Eclipse 中,我收到了使用“rawtypes”的警告,其中一个修复方法是添加 &lt;?&gt;。例如:

    Class parameter = String.class;
    //Eclipse would suggest a fix by converting to the following:
    Class<?> parameter = String.class;

&lt;?&gt; 究竟是什么意思?

【问题讨论】:

  • 如果您想深入了解泛型,请参阅effective chapter 5
  • 恕我直言,它代表混乱。 ;)

标签: java raw-types


【解决方案1】:

Class&lt;?&gt; 应该被解释为某事物的Class,但该事物不为人所知或不关心。

这是对 Java 泛型类型的使用。 Java 5 或更高版本中的Class 是参数化类型,因此编译器需要一个类型参数。 Class&lt;String&gt; 将在您的代码的特定上下文中工作,但同样,在许多情况下您并不关心实际的类型参数,因此您可以只使用 Class&lt;?&gt; 告诉编译器您知道 Class 期望一个类型参数,但你不关心参数是什么。

【讨论】:

    【解决方案2】:

    原始类型是指使用泛型类型而不指定类型参数。例如,List 是原始类型,而 List 是参数化类型

    有关更多信息,请参阅此文档:http://www.javapractices.com/topic/TopicAction.do?Id=224

    【讨论】:

    • @Jason 你在看什么版本的答案?
    【解决方案3】:

    这超出了本网站的范围,但这里有一些链接:

    【讨论】:

      【解决方案4】:

      警告意味着List 需要项目的类型,但您没有指定。由于编译器无法判断您是否犯了错误或忘记了什么,它会给出警告。

      有几种解决方案:如果您真的不在乎列表中的内容,请使用&lt;?&gt;。它的意思是“可以是任何东西,我不在乎。”

      如果您可能关心但这是旧的遗留代码并且您不想修复它,请告诉 Eclipse 在您正在转换时使用 @SuppressWarnings("rawtypes") 和/或 @SuppressWarnings("unchecked") 忽略它。

      最好的解决方案是找出正确的类型并使用它。这样,编译器可以帮助您在编译时捕获更多的拼写错误。

      【讨论】:

        【解决方案5】:

        自 Java 5(几年前)以来,Class 是一个泛型类型。

        阅读the Java tutorial about generics

        【讨论】:

          【解决方案6】:

          编译器抱怨是因为它代表一个通用通配符,因为括号之间指定的类型可以是任何引用类型。 Java 更喜欢强类型,并向您发出警告以说服您将具体类型指定为类型说明符。

          例如:

          Class<String> parameter = String.class;
          

          【讨论】:

            猜你喜欢
            • 2013-02-20
            • 2011-07-19
            • 2011-01-09
            • 2018-04-24
            • 2016-05-02
            • 1970-01-01
            • 1970-01-01
            • 2012-12-11
            • 1970-01-01
            相关资源
            最近更新 更多