@WTFAYD

Как происходит преобразование с участием параметризованных типов?

class FixedSizeStack<T> {
	// ...
	private Object[] storage;
	// ...
	@SuppressWarnings("unchecked") 
	public T pop() { return (T) storage[--index]; }
}

public class Program {
	// ...
	public static void main(String[] args) {
		FixedSizeStack<String> strings = new FixedSizeStack<String>;
		// ... заполняем массив
		for (int i = 0; i < SIZE; i++) {
			String s = strings.pop();
			System.out.print(s + " ");
		}
	}
}


В учебнике (Thinking in Java) говорится, что в методе pop() преобразования не происходит, так как T стирается до Object, и по сути происходит преобразование Object в Object. Однако почему информация сохраняется и этот код работает - выводит все String объекты? Я окончательно запутался, до этого момента было несколько моментов про создание объектов и массивов параметризованных типов, и там говорилось, что такое преобразование гуд:

При вызове get() объект преобразуется к T; это правильный тип, поэтому преобразование безопасно.

public T get(int index) { return (T)array[index]; }

Подскажите пожалуйста, что все-таки происходит на самом деле.
  • Вопрос задан
  • 134 просмотра
Решения вопроса 1
@void_phoenix
Дженерики существуют на этапе компиляции, все правильно, и в вашем случае действительно будет происходить преобразование Object в Object.

В вашем случае случилось так, что в массиве хранятся только объекты типа String поэтому для java на является проблемой сделать так
String s = strings.pop();
поскольку возвращается по факту String.
Однако, если, например, сделать метод для добавления таким

public void put(Object object){
storage[index++] = object;
}

то можно будет добавить в коллекцию Object

FixedSizeStack < String > strings = new FixedSizeStack<>(2);
strings.put(new Object());

то когда вы начнете забирать значения из коллекции, ваша программа упадет с ClassCastException в попытке привести объект к строке. То есть метод pop сработает нормально и вернет Object, и уже в строке
String s = strings.pop();
у вас получится String s = Object
и программа упадет.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы