为什么Java中的泛型未知类型?

时间:2015-06-29 11:27:38

标签: java generics

这是来自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>时的区别是什么?

1 个答案:

答案 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);
    }
}
  

现在,我们可以使用任何类型的集合来调用它。