java通用通配符“?”

java Generic wildcard “?”

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

1
2
3
4
5
6
7
8
9
10
class Unknown < ? > {

}

public class UnknownTypes {

    public static void main(String s[] ) {

    }
}

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

1
2
3
class Unknown < T > {

}

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

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

1
2
3
4
5
6
7
8
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
}

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


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

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

使用它时,您可以使用通配符

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

您不能将通用参数命名为?,因为?不是有效的标识符 - 变量的有效名称。 您必须为通用参数提供有效的Java名称,以便在实现中引用它。

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

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

创建实例时不能使用?

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

或作为类的参数名称:

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


您只在引用类的实例时使用通配符。 不在班级声明中。

1
2
3
4
5
6
7
class Unknown< T >{}

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


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

通配符意味着"任何"未知的东西。 您只能使用Alphabets作为类型参数。