2013-08-07 3 views
4

У меня есть общий тип с Class<T> объектом, предоставленным в конструкторе. Я хочу создать двумерный массив T[][] в этом конструкторе, возможно ли это?Создание общего двумерного массива с использованием объекта класса

+0

Не на Java, только на языках с генерируемыми генераторами, такими как C#. Подумайте о стирании. –

+0

Пожалуйста, разместите конкретную подпись конструктора, который вы собираетесь использовать. Это может быть возможно, но неясно, о чем вы спрашиваете. – chrylis

+1

Да, вы можете использовать Array.newInstance(). См. Http://stackoverflow.com/questions/529085/java-how-to-generic-array-creation. Я бы назвал дубликат, но у меня нет флагов, может кто-нибудь позаботиться об этом? –

ответ

14

То же 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() для деталей.

+0

Я заметил, что OP отредактировал вопрос и добавил «в этот конструктор». Тот же метод, что и выше (например, переместите код из массиваExample() в конструктор). –

+0

Спасибо, я не знал (и я думал, что я проверил в документации), что я могу использовать newInstance с большим количеством параметров - по моей вине, я мог проверить это. –

+1

Нельзя использовать для 'T [] []' (или что-то еще). 'cls' может быть примитивным типом. – newacct