/ / Java Generics :: невъзможност за осигуряване на безопасност на типа? - java, generics, изтриване на типа

Java Generics :: невъзможност за осигуряване на типа безопасност? - java, generics, изтриване на тип

Това е пример за стесняване на случай, в който попаднах.

Погледнете кода по-долу:

class Holder<T> {
private T t;
public Holder(T t) {
this.t = t;
}
public T getValue() {
return t;
}
}

public class FooMain {

private static Object newHolder() {
return new Holder<Integer>(3);
}

public static void main(String args[]) {
Holder<String> hs = (Holder<String>) newHolder(); // line-18
String s = hs.getValue();                         // line-19
}
}

Това, което ме уплаши, е, че неизбежното ClassCastException се хвърля линия 19 и не на линия 18 !

Следователно, като имате обект във вашия код, който е от тип Holder<String> не е достатъчно, за да гарантира това getValue ще върне a String, Вие също трябва да проучите как е построен този обект!

Разбрах, че Type Erasure играе роля тук, но не съм сигурен колко широки са последиците от горното. В моя конкретен случай newHolder-съответстващият метод се дефинира във външна библиотека и се връща java.lang.Object така че трябва да правя тези кастинги.

Отговори:

2 за отговор № 1

Ще получите предупреждение, когато това бъде съставено,казвайки, че "изпълнявате гласове, което означава, че компилаторът не може да гарантира безопасността на типа. Когато правите тези кастинги и получавате тези предупреждения, вие по същество сте сами. Тъй като генеричните файлове се реализират с помощта на изтриване в Java, общата информация за типа изчезва по време на изпълнение - това е чисто конструктивна конструкция на времето и по този начин, ако заобиколите това време на изпълнение може да не знае до по-късно, че сте извършили невалиден състав.


2 за отговор № 2

Генеричните лекарства са събиране на време инструмент за проверка за безопасност на типа. По време на изпълнение няма валидиране към момента тип изтриване, Ето защо получавате грешка при получаване на низ от цяло число.

BTW, трябва да получите предупреждение при кастинга. Пренебрегването на предупреждението може да има последствия ...