Java ArrayList несовместимые типы - PullRequest
1 голос
/ 15 февраля 2012

У меня проблема. Я пытаюсь добавить, и они получают объекты того же класса в ArrayList, но когда я пытаюсь получить их, я получаю несовместимые типы erroe

import java.util.*;

public class Test{

Test(){
    main();
}

List test = new ArrayList();

public void main(){
    test.add(new Square(10));

    Iterator i = test.iterator();
    while(i.hasNext()){
        Square temp = i.next();
    }
}
}

Ответы [ 3 ]

6 голосов
/ 15 февраля 2012

Да - вы нигде не используете обобщенные значения, поэтому i.next(); просто возвращает Object в том, что касается компилятора.

Параметры:

  • Используйте дженерики
  • В ролях Square:

    Square temp = (Square) i.next();
    

Лично я предпочел бы использовать дженерики - гораздо приятнее иметь безопасность типов там, где вы можете:)

// Not clear why this is an instance variable - and please make fields private :)
List<Square> test = new ArrayList<Square>();

public void main() {
    test.add(new Square(10));

    Iterator<Square> i = test.iterator();
    while(i.hasNext()) {
        Square temp = i.next();
        // Use square here
    }
}

Две стороны:

  • Усовершенствованный цикл for может заменить цикл while:

    for (Square square : test)
    
  • Странно иметь метод instance с именем main без параметров; более распространено иметь public static void main(String[] args). В том, что вы здесь сделали, нет ничего противозаконного, просто странно.

1 голос
/ 15 февраля 2012

Вы должны привести к Square:

while(i.hasNext()){
    Square temp = (Square) i.next();
}

Итератор вернет только Object элементы типа.

С Java 1.5+ и generics Мы можем сделать это без приведения:

// a list, that will only accept Square instances
List<Square> test = new ArrayList<Square>();

public void main(){
    test.add(new Square(10));

    Iterator<Square> i = test.iterator();
    while(i.hasNext()){
        Square temp = i.next();
    }
}
1 голос
/ 15 февраля 2012

Вы должны использовать универсальный тип List<Square>, ArrayList<Square> и Iterator<Square>, чтобы избежать этого.

Если вы этого не сделаете, компилятор не может «знать», каковы фактические типы элементов в test, и он «думает» о них как о типе Object.

List<Square> test = new ArrayList<Square>();
public void main(){
    test.add(new Square(10));

    Iterator<Square> i = test.iterator();
    while(i.hasNext()){
        Square temp = i.next();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...