2015-06-29 2 views
-2

Это Java-код из примера ANLTR.Почему неизвестный тип в generics с 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

Ниже приведена отрывок из this link, и я думаю, что он отвечает на ваш вопрос достаточно хорошо.

Рассмотрите проблему написания процедуры, которая выводит все элементы в коллекции. Вот как вы можете записать его в старой версии языка (то есть, до 5,0 релиз):

void printCollection(Collection c) { 
    Iterator i = c.iterator(); 
    for (k = 0; k < c.size(); k++) { 
     System.out.println(i.next()); 
    } 
} 

А вот наивная попытка написать его с помощью дженериков (и новый для синтаксиса цикла):

void printCollection(Collection<Object> c) { 
    for (Object e : c) { 
     System.out.println(e); 
    } 
} 

проблема заключается в том, что эта новая версия гораздо менее полезны, чем старый один. В то время как старый код можно было вызывать с любым типом коллекции в качестве параметра, новый код принимает только Collection, который, как только что продемонстрировал , не является супертипом всех видов коллекций !

Так что же такое супертип всех видов коллекций? Написано Коллекция (произносится как «коллекция неизвестных»), то есть коллекция , тип элемента которой соответствует чему угодно. Это называется подстановочным знаком по очевидным причинам. Мы можем написать:

void printCollection(Collection<?> c) { 
    for (Object e : c) { 
     System.out.println(e); 
    } 
} 

и теперь, мы можем назвать это с любым типом коллекции.