Java泛型通配符"?"

4

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

class Unknown <?> {

}

public class UnknownTypes {

    public static void main(String s[] ) {

    }
}

通配符"?"表示未知类型,在类Unknown中,我使用了泛型通配符本身;然而,当我进行编译时,会出现编译错误。如果我像这样使用它就可以工作了。
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<?> list = nonGenericGetList(); 这样的事情更有用(在使用旧库时经常这样做)。 - David Ehrmann
你在这里试图解决什么未知类型的问题? - Philip Whitehouse
为了说明David的陈述,想象一下如果你被允许使用?,你将如何使用该参数。例如,类成员声明private ? a是合法的,但这既不被允许也没有意义。 - Evan Sebastian
为什么通配符不能用于泛型类方法声明? - Vipin
4个回答

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

3
为了定义一个带有类型参数的泛型类,你不能使用通配符(在泛型类中它是一种类型)。
class Unknown <TYPE> {
  TYPE foo; // <-- specifies the type of foo.
}

使用时,可以使用通配符

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

2
你只有在引用类的实例时才使用通配符,不在类声明中使用。
class Unknown<T>{}

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


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

0

通配符意味着“任何东西”,而不是未知的。您只能使用字母作为类型参数。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接