Все параметры типа стираются компилятором Java и заменяются типом Object.
В этом отрывке конкретно говорится о параметрах типа в родовых классах. Так что, если вы пишете метод, который выглядит как этот
public <T> void foo(T arg);
тип arg
в сгенерированный метод будет java.lang.Object
. Ненулевые методы остаются неизменными.
Означает ли это, когда я пишу function(int a)
a заменяется объектом типа i.e с объектом Integer?
Нет, это не так, поскольку правило применяется только к общим методам и методам общих классов, которые используют параметры типового типа для своих аргументов или возвращаемых типов.
Так что, если мой List<>
предполагается хранить String
и если информация о String
удаляется и преобразуется в Object
, как же JVM знает, что это должно принять String
хранить в List<>
и как это проверить?
JVM не знает и не проверяет тип объектов, которые входят в список, потому что у него нет соответствующей информации. Вся проверка типов параметров типового типа выполняется во время компиляции. JVM знает, что объекты, которые попадают в список во время выполнения, на самом деле String
s, потому что компилятор обеспечил, чтобы все типы кода, безопасные для кода, помещали строки в список. Оборотная сторона этого заключается в том, что вы можете обмануть компилятор, чтобы вы помещали недопустимые объекты в список (например, Integer
s в список String
s) по типу, перебрасывающему список или используя его не общие методы, но обманывая компилятор предпринимает преднамеренные действия с вашей стороны.
Для получения дополнительной информации о тип erasure см. this tutorial.
Так что, если мой список должен хранить String и If информация о String удаляется и преобразуется в Object. Как JVM знает, что она должна принимать String для хранения в Списке и как это проверить. хранит ли она эту информацию где-нибудь, поскольку мы можем предоставить любой тип объекта? –
@AnkurAnand Эти проверки происходят полностью во время компиляции. Там обеспечивается соблюдение ограничений. – glglgl