java Generic wildcard"?"

时间:2014-07-14 15:51:15

标签: java generics

我提到了关于Java Generics的文档,并试图使用通配符"?"在一个简单的程序中:

class Unknown <?> {

}

public class UnknownTypes {

    public static void main(String s[] ) {

    }
}

Wildcard&#34;?&#34;指的是Unknown类型,因此在类Unknown中,我使用了type-parameter通配符本身;但是当我编译时,我得到编译错误。如果我这样使用它会有效。

class Unknown <T> {

}

如果是通配符&#34;?&#34;是指未知类型,为什么我们不能使用&#34;?&#34;作为类型参数。

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

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
}

是通配符&#34;?&#34;与其他东西一起使用?

4 个答案:

答案 0 :(得分:3)

您不能一般参数命名为?,因为?不是有效的标识符 - 变量的有效名称。您必须为泛型参数提供有效的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

答案 1 :(得分:3)

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

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

使用时,可以使用通配符

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

答案 2 :(得分:2)

在引用类的实例时,您只使用通配符。不在班级宣言中。

class Unknown<T>{}

Unknown<?> instance= new Unknown<Integer>();


public void canHandleAnyUnknown(Unknown<?> wild){
}

答案 3 :(得分:0)

通配符意味着什么&#39;不知道。您只能使用字母作为类型参数。