Значение по умолчанию для объектов
Проблема с вашим кодом:
default <E> void destroyArray(E[] array) {
Arrays.fill(array, (E) 0);
}
заключается в том, что общий тип E
, конечно, не обязательно int
(или что-то, что можетбыть автоматически упакованным как Integer
).Но вы на самом деле хотите написать какое-то значение по умолчанию .Поэтому вам необходимо создать действительные экземпляры E
.Что, в общем, сложно, потому что вы ничего не знаете о типе, включая его конструкторы.
Однако для всех Object
есть одно допустимое значение, а именно null
.Это означает, что в данный момент просто нет экземпляра.
Таким образом, следующее будет работать для произвольных типов E
:
default <E> void destroyArray(E[] array) {
Arrays.fill(array, null);
}
Примитивы
Однакопри этом вы по-прежнему не можете заполнять массивы примитивного типа, например int[]
, поскольку E
можно использовать только для Object
s, но не для примитивов.Вам нужно было бы жестко закодировать дополнительные методы для каждого примитива:
default void destroyArray(int[] array) {
Arrays.fill(array, 0);
}
default void destroyArray(double[] array) {
Arrays.fill(array, 0.0);
}
// ...
Примечание к Class<E>
Ваш исходный код имел Class<E>[]
вместо E[]
.Обратите внимание, что Class<E>
означает что-то совершенно иное, чем E[]
.
Class<E>
- это объект Class
, оболочка, обеспечивающая доступ Reflection-API к для анализа содержимого класса ,Как получить имена методов и тому подобное.Принимая во внимание, что E
- это сам класс.
Таким образом, Person
будет Person
классом, а Class<Person>
подобен классу, который знает что-то о классе Person
, например, имена его методов.
См. документацию из Class
для получения более подробной информации.