public static class Grid<T> {
public interface TFactory<T> {
T create();
}
private T[] data;
private int d1;
private int d2;
public Grid(int d1,
int d2,
Class<T> clazz,
TFactory<T> fac) {
this.d1 = d1;
this.d2 = d2;
data = (T[]) Array.newInstance(clazz, d1 * d2);
for (int i = 0; i < data.length; i++) {
data[i] = fac.create();
}
}
public T get(int c1,
int c2) {
return data[c1 * d2 + c2];
}
}
public static class ArrayListFactory<X> implements Grid.TFactory<ArrayList<X>> {
public ArrayList<X> create() {
return new ArrayList();
}
}
public static void main(String[] args) throws RTXException, ParseException {
// cannot use new new ArrayList<String>[4][4];, because of generic array creation error
List<String>[][] a2d = new ArrayList[4][4];
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 4; j++) {
a2d[i][j] = new ArrayList<String>();
}
}
Grid g = new Grid(4, 4, ArrayList.class, new ArrayListFactory<String>());
}
Вот два подхода.Во-первых, это то, что вы просили, во-вторых, инкапсулированная версия (с 2d-массивом, преобразованным в 1d-массив для облегчения внутренних манипуляций).
Как было сказано ранее, вы должны как можно больше объявлять переменные как интерфейсы (но не более).).Это означает, что если все, что вы хотите сказать, это List, и он не ожидает, что кто-то будет вести себя по-другому в зависимости от конкретной реализации, просто используйте List, а не ArrayList в качестве типа переменной.Но если вы используете, например.LinkedSet может быть хорошей идеей использовать LinkedSet в качестве типа переменной (и в качестве возвращаемого значения функций), если вы хотите «пообещать», что он перечисляет все элементы быстро и в порядке вставки.Если вы используете Set, пользователь этого не должен зависеть от какого-либо конкретного порядка итерации.
btw.остерегайтесь явной инициализации.Это хороший синтаксис, но он создает анонимный внутренний класс и может привести к непреднамеренному сохранению родительского класса.Но если вы знаете, что делаете, и что это невозможно (без внешних указаний), в этом нет ничего плохого.