未经检查的Arraylist警告

foo*_*ion 5 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());
  }
}
Run Code Online (Sandbox Code Playgroud)

编辑:迄今为止的回复已经回答了Arraylist声明.代码底部的排序警告怎么样?谢谢

Luc*_*lis 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;
    }
});
Run Code Online (Sandbox Code Playgroud)

关于Gerbil类,我建议你使用表单getNumber作为方法名称而不是number- 它是方法名称的事实标准,用于检索成员变量的值(以及分别setNumber(int value)用于设置它):

class Gerbil {
int gerbilNumber;

Gerbil(int gN) {
    gerbilNumber = gN;
    }

int getNumber() {
    return gerbilNumber;
    }
}
Run Code Online (Sandbox Code Playgroud)