Java Arraylist的未选中警告

Java Arraylist的未选中警告,java,warnings,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 Gerb

为什么我从-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());
  }
}
import java.util.*;
类CompareErbils实现Comparator{
公共整数比较(对象o1、对象o2){
返回((沙鼠)o2.number()-((沙鼠)o1.number();
}
}
沙鼠类{
沙鼠数量;
沙鼠(国际及北半球){
沙鼠数量=gN;
}
整数(){
返回沙鼠数;
}
}
公共类lt{
公共静态void main(字符串[]args){
//我希望能够将INT和字符串添加到列表中
ArrayList=新建ArrayList();
//未选中的呼叫警告:
增加第(1)款;
//未选中的呼叫警告:
列表。添加(“b”);
ArrayList gerbillist=新的ArrayList();
对于(int i=0;i<5;i++){
沙鼠学家。添加(新沙鼠(i));
}
//未选中的转换警告
//未经检查的方法调用
Collections.sort(gerbillist,newcomparegerbils());
}
}

编辑:到目前为止,答复已答复Arraylist声明。代码底部的排序警告如何?谢谢

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

你也可以

  • 将类型设置为正确的泛型
  • 使用@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");  
出于测试目的,我建议尝试对尚未排序的列表进行排序。一种简单的方法是使用shuffle()方法。这仍然可以排序,但列表越大,情况就越不可能如此

Collections.shuffle(gerbillis);
publicstaticvoidmain(字符串[]args){
最终列表=新的ArrayList();
增加第(1)款;
列表。添加(“b”);
最终列表gerbillist=new ArrayList();
对于(int i=0;i<5;i++){
沙鼠学家。添加(新沙鼠(i));
}
Collections.sort(gerbillist,newcomparegerbils());
}

之所以出现这种情况,是因为您尚未为
阵列列表定义数据类型。在
列表
中添加字符串和整数而不获得警告的唯一方法是将其定义为
ArrayList列表
——这就是此处隐式发生的情况(第
list.add(1)行;
1
隐式转换为
新整数(1)
——这称为自动装箱)。另外请注意,如果您希望在
列表中同时包含字符串和整数,排序方法实际上没有意义-您希望如何按字母或数字排序

编辑:此外,声明具体类型(即
ArrayList list
)被认为是不好的做法,除非您有很好的理由这样做。建议您使用界面进行初始化,即
列表

因此,您的代码必须是这样的(请注意
Comparator
部分,它修复了
Collections.sort
中的警告):

  • 你需要知道泛型

  • 您正试图在
    arraylist
    中添加
    原语和字符串。
    要么你这样做是为了带走任何东西

  • List List=new ArrayList();
    
    或者如果只允许字符串

     List<String> list = new ArrayList<String>();  
    
    List List=new ArrayList();
    
    我希望了解这些警告,而不是忽略或抑制它们。如何使类型成为正确的泛型?这是一个很好的比较点,尽管我多年来一直在其他语言中使用“a-b”而没有任何问题(并且认为这是一个常见的习语)。仔细想想,a>b更清晰,这是一个优点。当我打字时,其他人回答了,但我想做一个风格笔记。您的Comparator impl命名不正确,应该以大写字母开头。这并不意味着迂腐,但有一天维护这段代码时,您会发疯,想知道为什么变量声明的类型参数似乎是一个变量。请迂腐一点。正如我提到的,我只是在学习。我将进行更改。
    //我希望能够将INT和字符串添加到列表中
    ——这通常是一个设计缺陷。为什么要尝试创建一个包含基本不同类型内容的集合?排序警告是因为您定义的比较器没有数据类型,即
    new Comparator()
    而不是
    new Comparator()
    。我已经更新了我的答案以反映正确的用法。@马克·彼得斯:我现在只是在学习。我看到的所有示例都转换为单一类型,所以我想看看该语言是否具有这种灵活性。为什么是最终的?以及如何处理Collections.sort警告?我想你的意思是声明一个具体类型不是一个好的实践。初始化将始终归结为一种具体类型。@马克·彼得斯-你说得对,是固定的,去喝杯咖啡。返回g2.number()-g1.number();适用于比较逻辑。我用过其他语言。这在java中不是很好的形式吗?我看到Peter Lowrey已经回答了比较问题。@foosion:除了Peter的非常好的评论外,我还建议您在用java编码时使用
    getNumber
    而不是
    number
    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());
    }
    
    // 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;
        }
    });
    
    class Gerbil {
    int gerbilNumber;
    
    Gerbil(int gN) {
        gerbilNumber = gN;
        }
    
    int getNumber() {
        return gerbilNumber;
        }
    }
    
    List<Object> list = new ArrayList<Object>();
    
     List<String> list = new ArrayList<String>();