2015-06-03 2 views
-3

Что касается типа вывода в Java, у меня есть следующий фрагмент кода:Тип вывода в Java с итераторами?

ArrayList<String> projectNameList = new ArrayList<String>(3); 
projectNameList.add("Joe"); 
projectNameList.add("Jim"); 
projectNameList.add("Josh"); 

Iterator it = names.iterator(); 

while(it.hasNext()){ 
    System.out.println(it.next()); 
} 

я получаю ошибку компиляции, когда я пытаюсь напечатать имена говоря Несоответствие типов: невозможно преобразовать из объекта в строку

Я знаю, что исправить это все, что мне нужно сделать, это явно привести объект в строку, или явно объявить, что тип элементов, возвращаемых этой итератора имеют тип String, например, так:

Iterator it<String> = names.iterator(); 

Но я woul d подумали, что компилятор javac будет достаточно умным, чтобы указать тип, возвращаемый итератором, - это строки, которые рассматриваются как метод iterator(), который вызывается в ArrayList of Strings.

Любая причина, по которой этот тип вывода не имеет места?

+3

Я не верю, что ваш пример дает эту ошибку. –

+0

Вы действительно получите сообщение об ошибке, которое 'projectNameList' не объявлено. Если вы исправите это, вы не получите никакой ошибки компиляции вообще. – khelwood

+0

Пожалуйста, разместите свой код –

ответ

2

Iterator также является общим типом.

Вам необходимо объявить его как Iterator<String> it = names.iterator();, чтобы ссылаться на его элементы как String s без литья.

Объявление об этом в виде необработанного типа на самом деле говорит компилятору, что вы хотите, чтобы ваша ссылка была Iterator<Object>.

Как уже отмечался другими, вы не получите ошибку компилятора, просто печатая элементы сырой Iterator - вы будете, если вы ссылаетесь на несуществующие projectNameList переменных вместо, скажем, names.

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