В Java тип стирается во время выполнения, поэтому вам нужно передать другой аргумент, чтобы получить тип во время выполнения.
Это может быть либо значение для инициализации массивов, либо класс для использования.
Если вы решите передать класс, то укажите карту класса для значения, чтобы сохранить нулевое значение для каждого типа.
Затем вы можете использовать java.util.Arrays.fill
для заполнения массива:
private static HashMap<Class<?>, Object> ZEROS = new HashMap<Class<?>,Object>();
static {
ZEROS.put( Integer.class, Integer.valueOf(0) );
...
}
private static <T extends Number> T[][] zeroMatrix ( Class<T> type, int rows, int cols ) {
@SuppressWarnings("unchecked")
T[][] matrix = (T[][]) java.lang.reflect.Array.newInstance(type, rows, cols);
Object zero = ZEROS.get(type);
for ( T[] row : matrix )
java.util.Arrays.fill(row,zero);
return matrix;
}
Integer[][] matrix = zeroMatrix (Integer.class, 10, 10);
Однако, если производительность является проблемой удаленно, вы не хотите использовать коробочные значения для числового кода.
Вы действительно не хотите пытаться использовать ноль для нуля - это утроит сложность всех других путей в вашем коде. Хотя вам может не понравиться числовой класс поддержки, который обеспечит сложение и умножение различных типов чисел в штучной упаковке, сохраняемая вами сложность будет очень мала по сравнению с предоставлением двух или трех примитивных матриц и пары больших чисел особенно если вы используете систему шаблонов (например, задачу замены муравья или XSLT) для генерации исходного кода.