Разве параметр типа не играет никакой роли?

java generics

73 просмотра

1 ответ

31 Репутация автора

Предположим, у меня есть универсальный класс Parcel и универсальный метод доставки, показанный в приведенном ниже коде. Метод печатает и возвращает x, которому внутри метода назначен параметр типа Integer.

public class Parcel<T> {
    public <X> X deliver(){
        X x = (X) new Integer(100);
        System.out.println(x);
        return x;
    }
}

Внутри основного я вызываю метод доставки, передавая параметр типа Parcel. Однако это все еще печатает 100.

public static void main(String args[]) {
    Parcel<String> parcel = new Parcel<>();
    System.out.println(parcel.<Parcel> deliver());
}

Отсюда следует, что аргумент типа Parcel, переданный в строке печати, не играет никакой роли, и я ожидал здесь исключения. Как это работает ?

Автор: NaneV Источник Размещён: 18.07.2016 10:44

Ответы (1)


1 плюс

8544 Репутация автора

То, что вы наблюдаете, называется стиранием типа . Общие параметры используются компилятором для обеспечения корректности типов и не отображаются во время выполнения.

Вообще говоря, ничто не мешает вам сделать этот трюк:

List<Integer> list = new ArrayList<>();
list.append(""); // produces compiler error

// just drop that "useless" generic argument
List erased = (List) list;
erased.append(""); // works fine

РЕДАКТИРОВАТЬ

На самом деле мой оригинальный ответ иногда был для этой Parcelреализации

public class Parcel<T> {
    public T deliver(){
        T x = (T) new Integer(100);
        System.out.println(x);
        return x;
    }
}

Но основная идея одинакова для <X> X deliver():

Object parcel = parcel.<Parcel> deliver(); // erased, works ok
Parcel parcel = parcel.<Parcel> deliver(); // java.lang.ClassCastException
Автор: vsminkov Размещён: 15.08.2016 08:53
Вопросы из категории :
32x32