为什么我从-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声明。代码底部的排序警告怎么样?感谢
答案 0 :(得分:7)
您之所以这样,是因为您尚未为ArrayList list
定义数据类型。只有这样,才能同时添加字符串和整数在list
没有得到警告,是由它定义为ArrayList<Object> list
- 这就是隐含在这里发生(行list.add(1);
被隐式转换1
到new 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)
当您在需要泛型的上下文中使用非泛型类型时,会发出警告。编译说,你可能是对的,但我不能为你检查类型。
你也可以;
编辑:在这个例子中,你必须选择列表中元素的超类/接口。
// 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");
您可以选择Seralizable
或Comparable
而不是对象,但是它们可能很有用。事实上,除了练习外,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)
您需要了解Generics http://download.oracle.com/javase/1.5.0/docs/guide/language/generics.html
您正尝试在primitive
中添加arraylist
和一个字符串。
要么你这样做要采取任何措施
List<Object> list = new ArrayList<Object>();
或者如果您只想允许字符串
List<String> list = new ArrayList<String>();