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

问题描述 投票:0回答:5

我被分配编写一个程序,获取 100 个 0-25 之间的随机整数并将它们存储在数组中。 然后我必须调用两种方法来分割偶数和赔率(非常典型)。 所以我尝试了 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]);

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

java arraylist compiler-errors
5个回答
14
投票

这是因为您将

ArrayList
raw 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


4
投票

抱怨这个

ArrayList even = new ArrayList(1);

您有

ArrayList
的非通用版本。改为

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

这是通用且类型安全的。

此外(作为旁注)

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


1
投票

而不是这个:

ArrayList even = new ArrayList(1);

试试这个:

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

以下是优点:

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

1
投票

将此

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

或者 在属性/方法/类的顶部添加

@SuppressWarnings("rawtypes")


0
投票

使用@SuppressWarnings(“未选中”)

© www.soinside.com 2019 - 2024. All rights reserved.