经过许多帖子和建议后,我发现不使用像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>>();
但是我收到了很多错误,因此到目前为止失败了。
我是一名相对较新的编程,攻读计算机科学专业,所以请原谅我,如果我对上面列举的代码行有任何可怕的误解。
谢谢。
答案 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);
这应该仅用于演示泛型,我并不是说这是创建表的最佳方法。另外,我正在跳过你肯定需要的其他方法的实现(比如表元素的访问器等)。