Массив имеет отдельный тип во время выполнения.Если вы создаете массив Object, то есть его постоянный тип времени выполнения:
Object[] data = new Object[5];
System.out.println(data.getClass()); // Prints class [Ljava.lang.Object;
- Если вы создаете массив String, постоянный тип времени выполнения массива -
[Ljava.lang.String;
.
и т. Д.
Универсальные типы не существуют во время выполнения.Они являются механизмом безопасности типов, который полностью обеспечивается компилятором.Это означает, что T
во время выполнения не существует, что означает, что невозможно скомпилировать T[]
, потому что компилятор не может генерировать код, который создает определенный, известный тип массива.
Что вы можете с этим поделать?Обычно вы используете класс Collection, например ArrayList, но я предполагаю, что ваше назначение не позволяет этого.
Один из способов принудительного применения обобщений во время выполнения - сохранить объект Class в каждом экземпляре MyStack.
public class MyStack<T> {
int index;
private Object[] data;
private final Class<T> elementType;
public MyStack(Class<T> elementType) {
this.elementType = elementType;
index = 0;
data = new Object[5];
}
Затем можно использовать метод cast для обеспечения безопасности типов в методе pop
:
public T pop() {
return elementType.cast(data[--index]);
}