У меня есть общий тип с Class<T>
объектом, предоставленным в конструкторе. Я хочу создать двумерный массив T[][]
в этом конструкторе, возможно ли это?Создание общего двумерного массива с использованием объекта класса
ответ
То же How to create a generic array in Java? но дополненная 2D:
import java.lang.reflect.Array;
public class Example <T> {
private final Class<? extends T> cls;
public Example (Class<? extends T> cls) {
this.cls = cls;
}
public void arrayExample() {
// a [10][20] array
@SuppressWarnings("unchecked")
T[][] array = (T[][])Array.newInstance(cls, 10, 20);
System.out.println(array.length + " " + array[0].length + " " + array.getClass());
}
public static final void main (String[] args) {
new Example<Integer>(Integer.class).arrayExample();
}
}
Примечания после прочтения комментария джеба в выше: Для того, чтобы расширить до большего числа измерений, просто добавьте [] параметры 'S и размерности newInstance() (ЦБС является класса, d1 через d5 являются целыми числами):
T[] array = (T[])Array.newInstance(cls, d1);
T[][] array = (T[][])Array.newInstance(cls, d1, d2);
T[][][] array = (T[][][])Array.newInstance(cls, d1, d2, d3);
T[][][][] array = (T[][][][])Array.newInstance(cls, d1, d2, d3, d4);
T[][][][][] array = (T[][][][][])Array.newInstance(cls, d1, d2, d3, d4, d5);
См Array.newInstance()
для деталей.
Я заметил, что OP отредактировал вопрос и добавил «в этот конструктор». Тот же метод, что и выше (например, переместите код из массиваExample() в конструктор). –
Спасибо, я не знал (и я думал, что я проверил в документации), что я могу использовать newInstance с большим количеством параметров - по моей вине, я мог проверить это. –
Нельзя использовать для 'T [] []' (или что-то еще). 'cls' может быть примитивным типом. – newacct
Вы должны использовать отражение, но это возможно: http://docs.oracle.com/javase/7/docs/api/java/lang/reflect/Array.html#newInstance%28java.lang.Class,%20int...%29
Создает новый массив с указанным типом компонентов и размерами.
Не на Java, только на языках с генерируемыми генераторами, такими как C#. Подумайте о стирании. –
Пожалуйста, разместите конкретную подпись конструктора, который вы собираетесь использовать. Это может быть возможно, но неясно, о чем вы спрашиваете. – chrylis
Да, вы можете использовать Array.newInstance(). См. Http://stackoverflow.com/questions/529085/java-how-to-generic-array-creation. Я бы назвал дубликат, но у меня нет флагов, может кто-нибудь позаботиться об этом? –