未经检查的Arraylist警告

时间:2011-02-28 13:58:16

标签: java warnings

为什么我从-Xlint收到这4个警告,我该怎么办?我刚刚开始使用Java,所以很可能会遗漏一些明显的东西。

import java.util.*;

class CompareGerbils implements Comparator {
    public int compare(Object o1, Object o2) {
       return ((Gerbil)o2).number() - ((Gerbil)o1).number();
    }
}

class Gerbil {
int gerbilNumber;

Gerbil(int gN) {
    gerbilNumber = gN;
    }

int number() {
    return gerbilNumber;
    }
}

public class lt {
    public static void main(String[] args) { 

    // I'd like to be able to add both ints and strings to list
    ArrayList list = new ArrayList();

    //unchecked call warning:
    list.add(1);  

    //unchecked call warning:
    list.add("b");  

    ArrayList<Gerbil> gerbillist = new ArrayList<Gerbil>();

    for(int i = 0; i < 5; i++) {
        gerbillist.add(new Gerbil(i));
    }

    //unchecked conversion warning
    //unchecked method invocation
    Collections.sort(gerbillist, new CompareGerbils());
  }
}
编辑:迄今为止的回复已经回答了Arraylist声明。代码底部的排序警告怎么样?感谢

4 个答案:

答案 0 :(得分:7)

您之所以这样,是因为您尚未为ArrayList list定义数据类型。只有这样,才能同时添加字符串和整数在list没有得到警告,是由它定义为ArrayList<Object> list - 这就是隐含在这里发生(行list.add(1);被隐式转换1new Integer(1) - 这称为自动装箱)。还要注意,如果你想在lists中同时拥有字符串和整数,那么排序方法就没有意义 - 你是如何期望事物按字母或数字排序的?

编辑:此外,声明具体类型(即ArrayList<Object> list)并不是一种好习惯,除非您有充分的理由这样做。建议您使用界面初始化,即List<Object> list

因此,您的代码必须像这样(请注意Comparator<Gerbil>中修复警告的部分Collections.sort

// I'd like to be able to add both ints and strings to list
List<Object> list = new ArrayList<Object>();

list.add(new Integer(1));  

list.add(new String("b"));  

List<Gerbil> gerbillist = new ArrayList<Gerbil>();

for(int i = 0; i < 5; i++) {
    gerbillist.add(new Gerbil(i));
}

Collections.sort(gerbillist, new Comparator<Gerbil>() {
    public int compare(Gerbil o1, Gerbil o2) {
        int diff = o1.getNumber() - o2.getNumber();
        if (diff > 0)
           return 1;
        else if (diff <0)
           return -1;
        else
           return 0;
    }
});

使用对于沙鼠类,建议你使用表单getNumber作为方法名称,而不是number - 这是一个事实标准方法名来检索一个成员变量的值(和setNumber(int value)分别设置):

class Gerbil {
int gerbilNumber;

Gerbil(int gN) {
    gerbilNumber = gN;
    }

int getNumber() {
    return gerbilNumber;
    }
}

答案 1 :(得分:3)

当您在需要泛型的上下文中使用非泛型类型时,会发出警告。编译说,你可能是对的,但我不能为你检查类型。

你也可以;

  • 使类型成为正确的通用。
  • 使用@SuppressWarnings
  • 关闭警告
  • 忽略警告。

编辑:在这个例子中,你必须选择列表中元素的超类/接口。

// I'd like to be able to add both ints and strings to list
List<Object> list = new ArrayList<Object>();

list.add(1);  
list.add("b");  

您可以选择SeralizableComparable而不是对象,但是它们可能很有用。事实上,除了练习外,List<Object>很少有用。

实现Comparator的正确方法是使用比较。使用-仅在您知道不可能溢出时才有效。例如2000000000 - -2000000000&lt; 0而你可能期望2000000000 - -2000000000&gt; 0

class CompareGerbils implements Comparator<Gerbil> {
    public int compare(Gerbil a, Gerbil b) {
       return a.number() > b.number() ? +1 
            : a.number() < b.number() ? -1 : 0;
    }
}

出于测试目的,我建议尝试对尚未排序的List进行排序。一种简单的方法是使用shuffle()方法。这仍然可以排序,但列表越大,情况就越不可能。

Collections.shuffle(gerbillis);

答案 2 :(得分:2)

public static void main(String[] args) {
    final List<Object> list = new ArrayList<Object>();
    list.add(1);
    list.add("b");

    final List<Gerbil> gerbillist = new ArrayList<Gerbil>();
    for (int i = 0; i < 5; i++) {
        gerbillist.add(new Gerbil(i));
    }

   Collections.sort(gerbillist, new CompareGerbils());
}

答案 3 :(得分:1)

  1. 您需要了解Generics http://download.oracle.com/javase/1.5.0/docs/guide/language/generics.html

  2. 您正尝试在primitive中添加arraylist和一个字符串。 要么你这样做要采取任何措施

  3. List<Object> list = new ArrayList<Object>();
    

    或者如果您只想允许字符串

     List<String> list = new ArrayList<String>();