2011-10-13 38 views

回答

3

<?>语法是Java的方法来指定该通用类型是“无界” - 即它可以是“任何”。

Enumeration<?>是带有“无界类型”枚举 - 可以在任何类型的枚举分配给这样的变量,例如:然而

Vector<String> v = new Vector<String>(); 
Enumeration<String> es = v.elements(); 
Enumeration<?> e = es; // This assignment compiles OK 

,是无界的,所述nextElement()方法Enumeration<?>返回类型为Object(即使它实际上是一个Enumeration<String>),所以你可能要投:

String s = (String)e.nextElement(); // Unsafe cast - compiler warning 


有关背景,Enumeration是一种带有两种方法的分型接口hasMoreElements()nextElement()。这是一个早期(差)尝试,被IterableIterator取代。有几个老班使用它,如VectorStringTokenizer

+0

...和Servlet API:p –

0

?是通配符。你可以把它表示为?扩展对象或具有相同效果的类别的东西。从我的理解来看,通配符到目前为止并不完全是一门艺术,在java中它们需要有一定的限制*但是不要在此引用我

2

问号表示它代表所有类型。下面是一个example

除了具体的实例有所谓的通配符 实例。它们没有具体的类型作为类型参数,但是所谓的通配符是 。通配符是一个带有“ ?”的句法结构,它不仅表示一种类型,而且表示一种类型。在其最简单的形式 通配符只是一个问号,代表“所有 类型”。

(的通配符参数化的类型)实施例:

public void printPair(Pair<?,?> pair) { 
System.out.println("("+pair.getFirst()+","+pair.getSecond()+")"); 
} 

Pair<?,?> limit = new Pair<String,Long> ("maximum",1024L); 
printPair(limit); 
2

虽然很容易想到?表示“any”或“all”类型,但它实际上指定了单个未知类型。如果它真的是“任何”,你会期望这个工作:

List<?> l = ... 
l.add("foo"); 
l.add(new Date()) 

但它没有。这是因为该代码中的类型是未知的,所以编译器无法判断是否允许向其添加任何内容。