2012-03-05 4 views
2

Можно создать дубликат:
What is a raw type and why shouldn't we use it?Итератор <?> против итератора в Java

Вопрос в значительной степени самодостаточными в описании: в чем разница между

Iterator<?> 

и

Iterator 

объекты в java? Они оба перебирают типы объектов правильно?

+0

@ruakh: К сожалению, пытался найти подобный вопрос и не знал, как это слово. Спасибо за ссылку. – Bober02

+3

Не нужно извиняться.Единственная причина, по которой я мог найти этот вопрос, это то, что я уже знал, что ответ был «сырыми типами». Я отметил это как дубликат, чтобы указать вам на замечательные ответы там, вместо того, чтобы критиковать ваш вопрос о дублировании этого. – ruakh

ответ

4

Nope. Iterator<?> итерации более ? s (некоторый тип, который происходит от Object), в то время как Iterator предоставляет только Object s. Это поддержка дженериков в Java.

Что такое ?? Ну, это отличный вопрос.

В старые добрые времена перед Java 5 у вас были нетипизированные коллекции и нетипизированные итераторы. Таким образом, у вас будет Object s в ваших коллекциях, и вам придется вручную их вручную. Например:

List foo = new ArrayList(); 
foo.add("Foo!"); 

for(Iterator i = foo.iterator(); i.hasNext();) 
{ 
    Object element = i.next(); 

    System.out.println((String)element); 
} 

Обратите внимание, что литье? Это потому, что мы просто набиваем Object s в списки, и мы должны делать все это домашнее хозяйство. Не так уж плохо, всего лишь List, но представьте себе карту, содержащую карту, содержащую карту, содержащую ... ну, вы получаете идею. Вы бросаете ад, и вы можете довольно быстро не знать, смотрите ли вы на карту, которая идет от String до Integer или другую карту, которая идет назад от Integer до String.

В Java 5, вы можете использовать дженерики, так что теперь вы можете сказать:

List<String> foo = new ArrayList(); 
foo.add("Foo!"); 

for(Iterator<String> i = foo.iterator(); i.hasNext();) 
{ 
    String element = i.next(); 

    System.out.println(element); 
} 

Обратите внимание, что приведение не было необходимости? Когда мы используем List<String>, мы можем использовать Iterator<String> и иметь некоторую безопасность типов.

Это действительно полезно, когда вы начинаете делать вещи с более сложными структурами данных, как:

Map<String, Map<String, Map<String, SomeRandomObject>>> complexMap; 
1

Первое означает, что объекты, которые он выполняет, могут быть любыми. Второй на практике один и тот же, но теоретически это то, что у вас нет Generics, поэтому вы не используете преимущества, предоставляемые компилятором.

3

Нет разницы, за исключением того, что компилятор будет счастливее с первым, потому что тогда он знает, что вам не все равно, что итератор возвращает ;-)

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

Смежные вопросы