Как мне инициализировать объект типа T (общий параметр класса).
public class Bolsa<T> {
private int capacidad = 10;
private int elementosActual;
private T array;
public Bolsa(int capacidad) {
this.capacidad = capacidad;
array = new T[10];//Error en tiempo de compilación.
}
}
Вы не можете сделать это в Java из-за стирания типа. У вас есть следующие альтернативы:
Передайте класс
T
в качестве аргумента в конструкторе и создайте массив с помощью отражения:Клиентский код вызовет конструктор следующим образом:
Создайте массив
Object
и выполните соответствующее приведение при возврате элементов массива (используется в реализацииjava.util.ArrayList
):Используйте устройство на основе массива
Object
:Первый наиболее безопасен при разработке и выполнении. У второго и третьего есть хитрость в работе с массивом объектов и использовании приведения определенного типа, который будет удален во время выполнения, но поддерживается во время работы во время разработки. Кроме того, во втором и третьем вариантах вы должны быть осторожны, открывая массив напрямую клиентам, поскольку они могут повредить хранящуюся в нем информацию.
Есть две проблемы с кодом:
T
, которому вы хотите присвоить массив из 10 объектов типаT
, не является массивом, поэтому он вызовет ошибку компиляции, поскольку не может привести массив к объекту...T
может бытьInteger
,Cow
, или любым другимGod
,Raccoon
который вы определяете, но это никогда не известно, потому чтоT
на самом деле это класс). дикая карта для всех). С другой стороны, массивы ДОЛЖНЫ знать, к какому типу относятся их элементы. Поэтому наложено это ограничение.Этот метод получает два параметра: объект типа, также универсальный, который позволяет методу во время выполнения узнать, к какому классу он относится, и два — размер массива.
Array
newInstance
Class
T
Выражение используется для приведения типа объекта, возвращаемого этим методом (который, как указывает Javadoc, имеет тип Object) в массив типа , выражение, которое является безопасным, поскольку этот массив уже знает во время выполнения, класс к одному это относится к.
clase
Class<T>
(T[])
T