为什么我们要在 Java 中使用特定类型的列表

Why should we use a List of a particular type in Java

我目前正在学习 Java 中的课程,该课程涵盖通过静态方法传递 ArrayList 对象。在第一个静态方法中,您看到 ArrayList 只需声明为 ArrayList,并为其命名。第一个静态方法显示数组中的所有元素。第二个静态方法更改 ArrayList 的元素。在此方法中声明 ArrayList 时,必须声明为 ArrayList<Integer> 以进行修改。为什么会这样,为什么会有所不同?感谢任何愿意阐明这一点的人。

import java.util.ArrayList;

public class Chap11Part5
{
    public static void main(String[] args)
    {

        ArrayList<Integer> numbers = new ArrayList<Integer>();

        //For-Loop to create elements for the ArrayList
        for (int i = 1; i < 11; ++i)
            numbers.add(i);

        display(numbers); //Display Elements
        change(numbers, 5); //Change Elements (See "change" method)
        display(numbers); //Display New Results


    }

    //Loop to display elements of ArrayList
    static void display(ArrayList arr) {
        for(int i = 0; i < arr.size(); ++i)
            System.out.print(arr.get(i) + " ");
        System.out.println();
    }
    //Loop to change elements of ArrayList
    static void change(ArrayList<Integer> arr, int amount) {
        int value;
        for(int i = 0; i < arr.size(); ++i) {
            value = arr.get(i);
            arr.set(i, value + amount);
        }
    }

}

<> 语法称为 generics - 它允许您限制集合包含的元素类型,并按此类型引用它们。这不是必需的,它只是更方便。

例如,您可以在不指定任何泛型的情况下编写第二个方法,但您必须自己处理转换:

static void change(ArrayList arr, int amount) {
    int value;
    for(int i = 0; i < arr.size(); ++i) {
        value = (Integer) arr.get(i); // explicit casting here. Yuck!
        arr.set(i, value + amount);
    }
}

这是Java Generics API的例子。如果您声明为一个类型,该集合将只接受该类型的元素。

这解决了处理 ClassCastException 问题的问题,我们过去常常显式处理转换。

 value = (Integer) arr.get(i);

为特定类型(即您提到的 ArrayList<Integer>)制作 List 将消除运行时 ClassCastException 的风险。