2016-06-02 2 views
-5

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

// Can't create an instance of T. 
class Gen<T> { 
    T ob; 

    Gen() { 
    ob = new T(); // Illegal!!! 
    } 

    public static void main() { 

    Gen<Integer> genobj = new Gen<Integer>(); //Error 
    } 
} 

Когда код Java компилируется, все общие типа информация удаляется (стирается). Это означает замену параметров типа их связанным типом , который является объектом, если не указано явное ограничение, а затем применяя соответствующие приведения (как определено аргументами типа) для поддержания совместимости типов с типами , указанными аргументами типа. Компилятор также обеспечивает совместимость этого типа.

Мой вопрос: -Почему java complier здесь ошибается? Bevause после уступки.

Благодаря

+0

После компиляции тип 'T' стирается, поэтому программа не будет знать, какой тип вы пытаетесь создать. – khelwood

+0

Пожалуйста, исправьте меня, если я ошибаюсь. «T» заменен на Java.lang.Object – alakhya

+0

Gen genobj = new Gen () после усложнения это будет Gen genobj = new Gen () – alakhya

ответ

3

Есть несколько способов, которые могут работать здесь:

С логической POV:
Это даже не гарантируется, что независимо от шаблона параметра T вы используете имеет по умолчанию-конструктор. Очевидно, что проблема связана с отсутствием конструктора по умолчанию. Возможные решения заключались бы в создании ошибки времени выполнения, ошибки времени компиляции или запрете любого T, который не предоставляет конструктор по умолчанию. Последний, очевидно, нарушит определение шаблона, которое позволяет любойT. И ошибка времени выполнения осложнит ситуацию и даст ту же проблему, о которой говорилось выше. Остается предотвратить это поведение в первую очередь и выбросить ошибку времени компиляции.

С внутренней точки зрения:
Предположим, мы могли бы использовать предоставленный код. Тогда как это сработает? Из-за стирания new T() произведет Object. Но что, если T is Integer? Ну, мы ввернуты. Object не является Integer, поэтому мы получим простое исключение класса.

Итак, вкратце: позволяя вышесказанное скомпилировать, не будет работать из практического POV и, кроме того, сломать текущее определение дженериков в java.