java通用通配符&引用;

java通用通配符&引用;,java,generics,Java,Generics,我参考了有关Java泛型的文档,并尝试在一个简单的程序中使用通配符“?”: class Unknown <?> { } public class UnknownTypes { public static void main(String s[] ) { } } 类未知{ } 公共类未知项{ 公共静态void main(字符串s[]{ } } 通配符“?”表示未知类型,所以在类Unknown中,我使用了类型参数通配符本身;然而,当我编译时,我得到了编译错误。

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

class Unknown <?> {

}

public class UnknownTypes {

    public static void main(String s[] ) {

    }
}
类未知{
}
公共类未知项{
公共静态void main(字符串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
}
UnknownTypes.java:1:错误:应为
类未知{
^
UnknownTypes.java:1:错误:“{”应为
类未知{
^
java:10:错误:解析时到达文件末尾
}
通配符“?”是否与其他名称一起使用?

您不能将泛型参数命名为
,因为
不是有效的标识符-变量的有效名称。您必须为泛型参数指定有效的java名称,以便在实现中引用它

只能将
指定为通用绑定:

List<?> list; // a variable holding a reference to a list of unknown type
或作为类的参数名:

class MyClass<?> { // can't do this
class MyClass{//无法执行此操作

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

class Unknown<T>{}

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


public void canHandleAnyUnknown(Unknown<?> wild){
}
类未知{}
未知实例=新未知();
公共空间canHandleAnyUnknown(未知野生){
}

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

类未知{

类型foo;//通配符意味着“任何”都不是未知的。您只能使用字母作为类型参数。

未知的含义是它永远不会被知道。通配符在类声明中没有意义,因为当您实例化类时,您将使用类型参数化它。它对于
List=nonGenericGet之类的事情更有用List();
(在使用旧库时,您会经常这样做)。您试图用未知类型解决什么问题?为了说明David的陈述,想象一下如果允许您使用参数,您将如何使用该参数?。例如,类成员声明(如
private?a
)将是合法的,既不允许也没有意义。请参见完全相同的问题
class Unknown<T>{}

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


public void canHandleAnyUnknown(Unknown<?> wild){
}
class Unknown <TYPE> {
  TYPE foo; // <-- specifies the type of foo.
}
Unknown<?> some = new Unknown<String>(); // <-- some is any kind of Unknown.