【问题标题】:java Generic wildcard "?"java通用通配符“?”
【发布时间】:2014-09-04 14:36:57
【问题描述】:

我参考了有关 Java 泛型的文档,并尝试使用通配符“?”在一个简单的程序中:

class Unknown <?> {

}

public class UnknownTypes {

    public static void main(String s[] ) {

    }
}

通配符“?”指的是一个未知类型,所以在未知类中,我使用了类型参数通配符本身;但是,当我编译时,我得到编译错误。如果我像这样使用它会起作用的。

class Unknown <T> {

}

如果是通配符“?”指未知类型,为什么不能用“?”作为类型参数。

以下是我得到的编译错误。

UnknownTypes.java:1: error: <identifier> expected
class Unknown <?> {
           ^
UnknownTypes.java:1: error: '{' expected
class Unknown <?> {
            ^
UnknownTypes.java:10: error: reached end of file while parsing
}

是通配符“?”与其他东西一起使用?

【问题讨论】:

  • 未知的意思是它永远不会被知道。通配符在类声明中没有意义,因为当您实例化该类时,您将使用类型对其进行参数化。它对List&lt;?&gt; list = nonGenericGetList(); 之类的东西更有用(在使用旧库时你会经常这样做)。
  • 你想用未知类型解决什么问题?
  • 为了说明 David 的陈述,想象一下如果允许您使用该参数,您将如何使用?。例如,private ? a 之类的类成员声明是合法的,这是不允许的,也没有任何意义。
  • 看到完全相同的问题stackoverflow.com/questions/9914302/…

标签: java generics


【解决方案1】:

要定义带有类型参数的泛型类,不能使用通配符(在泛型类中它是一个类型)

class Unknown <TYPE> {
  TYPE foo; // <-- specifies the type of foo.
}

使用时可以使用通配符

Unknown<?> some = new Unknown<String>(); // <-- some is any kind of Unknown.

【讨论】:

    【解决方案2】:

    您不能将泛型参数命名?,因为? 不是有效的标识符——变量的有效名称。您必须为泛型参数提供一个有效的 java 名称,以便您可以在实现中引用它。

    您只能将? 指定为通用绑定:

    List<?> list; // a variable holding a reference to a list of unknown type
    

    创建实例时不能使用?

    new ArrayList<?>(); // can't do this
    

    或作为类的参数名称:

    class MyClass<?> { // can't do this
    

    【讨论】:

      【解决方案3】:

      只有在引用类的实例时才使用通配符。不在类声明中。

      class Unknown<T>{}
      
      Unknown<?> instance= new Unknown<Integer>();
      
      
      public void canHandleAnyUnknown(Unknown<?> wild){
      }
      

      【讨论】:

        【解决方案4】:

        通配符表示未知的“任何事物”。您只能使用字母作为类型参数。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-11-13
          • 1970-01-01
          • 2011-01-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多