Java ArrayList不兼容的类型

时间:2012-02-15 09:39:10

标签: java collections

我有一个问题。我正在尝试添加并将它们检索到同一类的对象到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 个答案:

答案 0 :(得分:6)

是的 - 您没有在任何地方使用泛型,因此就编译器而言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)
    
  • 有一个名为main实例方法没有参数,这很奇怪;拥有public static void main(String[] args)更为常见。关于你在这里所做的事情,没有什么不合法的,只是奇怪的。

答案 1 :(得分:1)

您应该使用generic类型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();
    }
}

答案 2 :(得分:1)

你必须施展到Square

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

迭代器只返回Object类型元素。

使用Java 1.5+和泛型,我们可以不进行强制转换:

// 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();
    }
}