Я использую связанный класс списка для добавления элементов. Чтобы получить элементы один за другим, я использовал Итератор, чтобы получить только четные ню.
проблема
1 l.add(p) в коде показывает ошибку, когда я пытаюсь принимать числа от 1 до 10
и когда я ставлю l.add("p"); // нет ошибки, почему?
2 При попытке получить Integer Object я не мог применять оператор modulas, но почему?
Вот приложение пакета кода; import java.util. *; public class IteratorDeo1 {public static void main (String s []) {
LinkedList l=new LinkedList();
for(int p=0;p<=10;p++)
{
l.add("p");
//l.add(p); here 1st error comes why
}
System.out.println(l);
Iterator i=l.iterator();
while(i.hasNext())
{
Integer I=(Integer)i.next();
if( I % 2 == 0 ) here comes 2nd error
System.out.println(I);
else
i.remove();
}
System.out.println(l);
}
Вы хранение "p"
в 11 раз, что является буквальной String
, а не Integer
. После добавления "p"
вы добавляете "2"
который является еще одним литералом String
, а не Integer
.
Чтобы убедиться, что вы добавляете Integer
или объект определенного типа, вы должны использовать generics:
LinkedList<Integer> l=new LinkedList<Integer>();
for(int p=0;p<=10;p++)
l.add("p"); // compiler error here: you're adding a String, not an Integer
Если вы используете Java 1.4 или ранее (что очень странно в это время), то вы не можете использовать generics, но вы по-прежнему можете защитить себя от этого ClassCastException
, используя оператор instanceof
:
Iterator i=l.iterator();
while(i.hasNext()) {
Object current = i.next();
if (current instanceof Integer) {
Integer I = current;
//rest of your code...
}
}
Кроме того, unboxing и autoboxing находятся на Java с версии 5. В Java 1.4 или ранее вам необходимо получить значение int
обертки и выполнить оператор модуля вручную:
if (I.intValue() % 2 == 0) {
//rest of code...
}
LinkedList
реальные Integer
, а не String
.