2014-12-08 2 views
4

у меня есть:Java: Почему универсальный класс не применяет такой же тип?


    public final class SomeClass<L, R>{ 
    .... 
    } 

Если я:


    public final class SomeClass<L, R>{ 
    .... 

    public someMethod(Object obj) 
    { 
    SomeClass other<L, R> = (SomeClass<L, R>) obj; 
    .... 
    } 
    .... 
    SomeClass<String, String> firstObject = new SomeClass<String, String>(); 
    SomeClass<Integer, Integer> secondObjec = new SomeClass<Integer, Integer>(); 
    firstObject.someMethod(secondObject); 
    ... 

Он не бросает литье исключения, даже если L и R типов отличаются от firstObject к secondObject. Почему?

+6

Я не вижу здесь общего класса ... –

+1

все меньше и больше не сбежали :) посмотрите еще раз, пожалуйста – Roxana

ответ

4

Этот код будет скомпилирован, потому что вы передаете объект в качестве параметра и явно укажете его на SomeClass<L, R>. Из-за type erasure это будет работать во время выполнения, если вы передадите любой экземпляр SomeClass, потому что к этому времени исчезнут все общие типы. Я предполагаю, что вы получаете предупреждение Type safety: Unchecked cast from Object to SomeClass<String, String> во время компиляции (если вы не указали @SuppressWarnings("unchecked")).

Чтобы избежать этого, вы должны указать тип объекта, вы разрешили передать в качестве параметра, делая, например:

public someMethod(SomeClass<L, R> obj) 
2

Обобщения в Java проверяются компилятором. Он не учитывается во время выполнения.