这是来自ANLTR示例的Java代码。
public class SimpleLexer implements TokenSource {
public static final int ID = 1; // Token.MIN_USER_TOKEN_TYPE;
public static final int INT = 2;
public static final int SEMI = 3;
CharStream input;
TokenFactory<?> factory = CommonTokenFactory.DEFAULT;
为什么在这种情况下会使用未知类型?使用TokenFactory<Object>
时的区别是什么?
答案 0 :(得分:1)
以下是this link的摘录,我认为它很好地回答了您的问题。
考虑编写打印出所有内容的例程的问题 集合中的元素。以下是您可以在较旧版本中编写的内容 该语言的版本(即5.0之前的版本):
void printCollection(Collection c) {
Iterator i = c.iterator();
for (k = 0; k < c.size(); k++) {
System.out.println(i.next());
}
}
这是一个天真的尝试使用泛型(和新的 for循环语法):
void printCollection(Collection<Object> c) {
for (Object e : c) {
System.out.println(e);
}
}
问题是这个新版本比旧版本更有用 一。可以使用任何类型的集合调用旧代码 作为参数,新代码只接受Collection,as,as 我们刚才证明,不是各种类型的超类型 集合!
那么各种收藏品的超类型是什么?它是写的 集合(发音为“未知的集合”),即a 元素类型匹配任何东西的集合。它被称为通配符 类型明显的原因。我们可以写:
void printCollection(Collection<?> c) {
for (Object e : c) {
System.out.println(e);
}
}
现在,我们可以使用任何类型的集合来调用它。