在使用泛型而不是原始类型时实现List而不是ArrayList

时间:2014-12-16 14:46:59

标签: java list generics arraylist parameterized

经过许多帖子和建议后,我发现不使用像ArrayList这样的具体实现,而应该使用List代替,以便在List接口的不同实现之间实现灵活性。到目前为止,我已经看到许多程序员建议使用以下代码:

List list = new ArrayList();

但是,这会在编译器中发出警告,使用原始类型List和ArrayList,并且它们实际上应该参数化。

这些警告的同义词,我发现有几个帖子告诉我永远不应该使用原始类型,并且我应该利用java提供的泛型来方便。

就个人而言,我正在尝试实现一个类,该类充当需要内部使用ArrayLists的2维列表结构的表。 我正在尝试实现以下代码行:

List<List> table;
table = new ArrayList();
table.add(new ArrayList());

在我的脑海中设想,表结构应该能够容纳多种变量类型,例如原始数据类型以及String变量类型​​。我试图实现泛型,例如使用

List<List<Object>> table = new ArrayList<ArrayList<Object>>();

但是我收到了很多错误,因此到目前为止失败了。

我是一名相对较新的编程,攻读计算机科学专业,所以请原谅我,如果我对上面列举的代码行有任何可怕的误解。

谢谢。

3 个答案:

答案 0 :(得分:2)

你想这样做:

List<List<Foo>> table = new ArrayList<List<Foo>>();
table.add(new ArrayList<Foo>())

Foo是表格中存储的类型。

您希望类型和值的泛型参数相同。

答案 1 :(得分:1)

import java.util.ArrayList;
import java.util.List;

public class Sample<T> {

    private final int x;
    private final int y;
    private final List<List<T>> list;

    public Sample(final int x, final int y) {
        this.x = x;
        this.y = y;
        list = new ArrayList<>();
        for(int k=0; k<y; k++) {
           list.add(k, new ArrayList<T>());
        }
    }


    public T get(final int indexX, final int indexY) {
        if(indexX >= x) {
            return null;
        }
        if(indexY >= y) {
            return null;
        }
        return list.get(indexX).get(indexY);
    }

现在你可以致电Sample<String> s = new Sample<>();并完成。希望它能回答你的疑问。

答案 2 :(得分:0)

您应该使您的类通用,以避免警告/错误。也许我写的这个小班会帮助你:

import java.util.ArrayList;
import java.util.List;

/**
* Creates a List of Lists of the given type
* @param <T> - The type of the table elements
*/
public class Table <T> {
    private final List<List<T>> data;

    public Table(int rows, int cells) {
        data = new ArrayList<List<T>>(rows);
        for(int i=0; i<rows; i++) {
            data.add(new ArrayList<T>(cells));
        }
    }

    public static void main(String[] args) {
        //create a table of strings
        Table<String> table = new Table<String>(10, 10);
        //do something with table
    }
}

如果您希望表格包含各种元素,请按以下方式创建:

Table<Object> table = new Table<Object>(10, 10);

这应该仅用于演示泛型,我并不是说这是创建表的最佳方法。另外,我正在跳过你肯定需要的其他方法的实现(比如表元素的访问器等)。