ArrayList的不安全或未经检查的操作

时间:2012-10-18 05:38:42

标签: java arraylist compiler-errors

我被分配制作一个程序,在0-25之间获得100个随机整数,并将它们存储在一个数组中。 然后,我必须要求两种方法来分割平均值和赔率(非常典型)。 所以我尝试了ArrayList的东西(我开始学习它)它看起来很好(我在线跟踪教程和事情)直到遇到这个: Unit8.java使用未经检查或不安全的操作

我的代码是:

    import java.util.*;
    import java.awt.*;

    public class Unit8
    {
public static void main (String [] args)
{
    //create an array for original 100 integers
    //create a 2D array for evens and odds
    //split them up using 2 methods

    int[] originalArray = new int[100];
    ArrayList even = new ArrayList(1);
    ArrayList odd = new ArrayList(1);

    for (int x = 0; x < originalArray.length; x++)
    {
        originalArray[x] = (int)(Math.random() * 25);
    }

    evensDivider(originalArray, even);
    oddsDivider(originalArray, odd);
}

public static void evensDivider (int[] e, ArrayList even)
{


    for (int y = 0; y < e.length; y++)
    {
        if (e[y]%2 == 0)
            even.add(e[y]);
    }

    System.out.println("The evens are: " + even);
}

public static void oddsDivider (int[] o, ArrayList odd)
{


    for (int z = 0; z < o.length; z++)
    {
        if (o[z]%2 == 1)
            odd.add(o[z]);
    }
}

}

错误发生在:         even.add(e[y]); 和           odd.add(o[z]);

请帮我解决这个问题,我已尽力使其清晰易懂。

4 个答案:

答案 0 :(得分:14)

这是因为您将ArrayListraw type一起使用。并且您正在为其添加特定类型。

原始类型ArrayList需要Object类型的元素。如果添加任何其他类型,则编译器不会确切地知道您要存储的类型。因此,它会为您提供 unchecked or unsafe operations ,以警告您可能做错了。

您最好创建一个Generic ArrayList: -

List<Integer> evenNumbers = new ArrayList<Integer>();

另外,请在method签名中进行更改: -

public static void evensDivider (int[] e, List<Integer> evenNumbers)

PS : - 如果您有interface type,则应始终引用List。我的意思是使用ArrayList代替{{1}}

答案 1 :(得分:3)

这是抱怨这个

ArrayList even = new ArrayList(1);

你有ArrayList的非通用版本。将其更改为

List<Integer> even = new ArrayList<Integer>(1);

这是通用的和类型安全的。

另外(作为旁注)new ArrayList(1);中的值1指定列表的初始容量。该功能适用​​于您知道将向列表中添加大量元素的情况,在这种情况下,您将提供更大的数字,这将有助于避免调整大小开销。传递一个小值(如1)是没有意义的。

答案 2 :(得分:1)

而不是:

ArrayList even = new ArrayList(1);

试试这个:

List<Integer> evens = new ArrayList<Integer>(50);

以下是优点:

  • 这个List只能保存数字(整数,实际上也称为整数),我假设它是警告的来源。
  • 它有一个复数名称,更能反映它是什么,列表
  • 它实例化的大小为50(而不是1),这与你期望的大小有关。

答案 3 :(得分:1)

将此ArrayList even = new ArrayList(1);替换为ArrayList<Integer> even = new ArrayList<Integer>(1);

在属性/方法/类的顶部添加@SuppressWarnings("rawtypes")