2015-03-13 3 views
0

При чтении О виртуальной машине Java .. я наткнулся на этих линияхЧто подразумевается под параметризацией типа через стирание в java?

Виртуальная машина Java ничего не знает о параметрах типа. Все параметры типа стираются компилятором Java и заменены типом Object. Затем массив типа параметра T становится массивом объекта в контексте JVM, поэтому вы не можете писать выражения типа нового T [n].

Означает ли это, когда я пишу

Function (интермедиат а)

а заменяется с объектом типа с т.е. Integer объекта? или int[10]; будет Integer[10]; Если не так, что это значит сказать?

Просьба пояснить это простой терминологией.

ответ

0

№ Параметры типа - это угловые скобки.

List<Integer> list = new List<>(); 

Integer - это параметр типа.

1

Вы ошибаетесь: тип стирания связан с Java Generics.

Если вы пишете что-то вроде List<String> l = new ArrayList<String>();, информация о String удаляется во время процесса компиляции; JVM ничего не знает об этом.

+0

Так что, если мой список должен хранить String и If информация о String удаляется и преобразуется в Object. Как JVM знает, что она должна принимать String для хранения в Списке и как это проверить. хранит ли она эту информацию где-нибудь, поскольку мы можем предоставить любой тип объекта? –

+0

@AnkurAnand Эти проверки происходят полностью во время компиляции. Там обеспечивается соблюдение ограничений. – glglgl

2

Все параметры типа стираются компилятором 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.

+0

Так будет ли правильный тип возврата? Хотя некоторые из нижеприведенных ответов были изложены о коллекциях (общий тип) Список l = new ArrayList (); информация о String удаляется во время процесса компиляции; JVM ничего не знает об этом. Можете ли вы объяснить мне это? \t Итак, если мой список должен хранить String и если информация о String удалена и преобразована в Object. Как JVM знает, что он должен принимать String для хранения в Списке и как он проверяет. хранит ли она эту информацию где-нибудь, поскольку мы можем предоставить любой тип объекта? –

+0

@AnkurAnand Да, это относится и к типам возвратов. Для параметров типового типа, используемых в качестве параметров других общих типов (например, 'T' в' List '), выполняется также замена. – dasblinkenlight

0

Тип стирания относится к использованию дженериков. В файле класса есть определенные метаданные, чтобы сказать, является ли метод/тип обобщенным, и какие ограничения существуют и т. Д. Но когда используются дженерики, они преобразуются в проверки времени компиляции и касты выполнения.

3

Тип стирания относится только к Generics. Такой метод, как Function(int a), не будет затронут.

С другой стороны, этот код:

public class Node<T> { 

    private T data; 
    private Node<T> next; 

    public Node(T data, Node<T> next) } 
     this.data = data; 
     this.next = next; 
    } 

    public T getData() { return data; } 
    // ... 
} 

Будет заменен следующим образом:

public class Node { 

    private Object data; 
    private Node next; 

    public Node(Object data, Node next) { 
     this.data = data; 
     this.next = next; 
    } 

    public Object getData() { return data; } 
    // ... 
} 

(пример взят из here)

+0

Спасибо за это приятное объяснение :) –

Смежные вопросы