2016-07-19 3 views
-1

У меня есть интерфейс Int1. У меня есть класс Cls1, реализующий Int1. И общий класс Cls2<Cls1>.Литье подтипа типа, определенного как общий

Сейчас я пишу метод:

private void <T extends Int1> test(Cls2<Cls1> arg1) { 
    ... 
    //I try to cast a Cls2<Cls1> into a Cls2<Int1>: it works 
    Cls2<Int1> test1 = (Cls2<Int1>) arg1; 
    //I try to cast a Cls2<Cls1> into a Cls2<T>: doesn't work 
    Cls2<T> test2 = (Cls2<T>) arg1; //compilation error 
} 

Учитывая, что T расширяет Int1, что случилось с этим кодом?

+0

«он работает», потому что он избыточен: вам не нужно вводить тип в себя. –

+0

«ошибка компиляции», потому что 'T' не всегда' Cls1'; он * может * быть 'Cls1', но он также может быть подклассом. –

+1

В чем смысл создания метода (добавление ''), когда 'T' не используется в сигнатуре метода. – Andreas

ответ

0

Код ниже компилирует без ошибок в intellij.

interface Int1{} 
class Cls2<T>{} 
class Cls1 implements Int1 {} 


private <T extends Int1> void test(Cls2<Cls1> arg1) { 
    Cls2<Int1> test1 = (Cls2<Int1>)(Cls2<?>)arg1; 
    Cls2<T> test2 = (Cls2<T>) arg1; 
} 

В java класс, параметризованный подклассом и суперклассом, не связан. Сначала нужно наложить на <?>.

В целом, если то, что у меня выше, отражает ваш код правильно, это очень странное использование дженериков. Пожалуйста, убедитесь, что ваш дизайн правильный.

+0

Я не показывал свой полный вариант использования, но это потому, что возвращаемое значение метода набирается 'T', а также один из аргументов. И где-то в этом методе я получаю объект, набранный с подтипом 'T'. Я не мог понять, почему это было недействительно, чтобы вернуть его ... Есть ли способ сделать это без предупреждений и без подавления предупреждения? – FBB

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