2012-03-20 3 views
0

Каков правильный способ преобразования дженериков в java?Как конвертировать дженерики в java?

interface A { 
} 

class B implements A { 

} 

class C { 
    public Set<B> returnSomeB(){ 
    //some logic 
    } 
} 

C c = new C(); 
Set<A> = c.returnSomeB(); 

Set<A> = c.returnSomeB(); эта линия даст мне компиляцию ошибки времени, что самый правильный способ легко преобразовать это, так как класс B является конкретным класс интерфейса?

+0

Ну, предполагая, что это ваш код, я вижу одну непосредственной проблемы: Set просто тип, без объявления переменного. – Taymon

+0

Его ошибка времени компиляции, потому что нет объявления переменной Set = c.returnSomeB(); Что вы назначаете значение c.returnSomeB() для? – sachinrahulsourav

+0

ОК, это был просто код psuedo, который я написал из моего ума, не проверяя. Вопрос был только о проверке типа – beku8

ответ

2

переменная типа Set<A> может содержать только Set<A> объект, а не Set<B>, хотя B является подтипом A.

Причина заключается в следующем: Что делать, если вы сохранили Set<B> объект в Set<A> переменной, затем добавляют объект типа A (но не B) к нему? Он будет соответствовать всем правильным типам аргументов, но конечным результатом будет нарушение безопасности типа Java.

Чтобы обойти это, вы можете использовать подстановочные знаки. Вместо объявления переменной типа Set<A>, объявите один из типов Set<? extends A>.

+0

ok tnx, поэтому я предполагаю, что мне еще нужно добавить декларацию объявления Set a = (Set ) c.returnSomeB(); как это правильно? – beku8

+0

Всё зависит от меня. Что вы на самом деле собираетесь _do_ со значением из 'returnSomeB()'? – Taymon

+0

@ gun-armod Нет, вы никогда не должны бросать родовой тип типа '(Set )'. Вот почему компилятор дает вам предупреждение о безопасности типа. – erickson

0

Попробуйте ограничивающий свой параметр типа для максимально широкого охвата допустимых значений:

interface A { 
} 

interface B extends A { 
} 

class C { 
    public static void main(String[] args) { 
     final Set<A> foo = C.returnSomeB(); 
     final Set<B> bar = C.returnSomeB(); 
    } 

    public static <T extends A> Set<T> returnSomeB() { 
     return null; 
    } 
} 
+0

'super B', я думаю (это законно, я всегда забываю). –

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