2014-11-23 1 views
1

Вот как метод returnObj способен возвращать объект типа типа TestGen, даже если «Тип Erasure» уменьшил T до Object ,Как верный тип объекта возвращается, хотя тип Erasure уменьшил T до объекта

class TestGen 
{ 

} 

class MyGeneric<T> 
{ 
    T obj; 
    MyGeneric(T giveObj) 
    { 
     obj = giveObj; 
    } 

    T returnObj() 
    { 
     return obj; 
    } 

} 
public class TestGeneric { 

    public static void main(String[] args) { 
     MyGeneric<TestGen> mg = new MyGeneric<TestGen>(new TestGen()); 
     TestGen tg = mg.returnObj(); 

    } 

} 
+0

Поскольку 'TestGen' наследует' Object'? – SLaks

+0

Объекты не меняются от одного типа к другому. Как только объект TestGen, всегда объект TestGen. –

ответ

2

Это обман все составителя: поскольку компилятор знает, что параметр типа MyGeneric «s является TestGen, он спокойно вставляет тип ввергнуть за сценой. Если вы декомпилировать обратный вызов от байткода, это будет выглядеть примерно так:

TestGen tg = (TestGen)mg.returnObj(); 

Компилятор подтвердил, что вызов будет иметь успех во время выполнения.

+1

Да! Использование дженериков заставляет компилятор вставлять операции литья для вас, вместо того, чтобы вам явно вставлять их. Вы получаете по сути один и тот же код в любом случае. –

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