2012-03-23 74 views
1

仿制药具有超强

public class Organic<E> { 
    void react(E e) { 
    } 

    static void main(String[] args) { 
     Organic<? super Elem2> compound = new Organic<Elem>(); 
     compound.react(new Elem()); 
    } 
} 

class Elem {} 

class Elem2 extends Elem {} 

为什么有编译错误

的方法反应(捕获#1-的?超级elem2时)在类型有机不适用于参数( Elem)

回答

0

编译器不能查看组合的实际值,而只能查看它的声明。而?本身可能是Elem2。它应该不会让你拨打Organic<Elem2>.react(Elem)

0

List中的有界通配符可以捕获Elem2及其任何超类型。由于elem2时扩展ELEM,这意味着只有类型目前捕捉兑换的名单是:

List<Elem2> 
List<Elem> 
List<Object> 
0

这应该工作

Organic<Elem> compound = new Organic<Elem>(); 

这是行不通的,因为他们是通配符(分配工作,呼吁反应不会)

Organic<?> compound = new Organic<Elem>(); 
    Organic<? extends Elem> compound = new Organic<Elem>(); 
    Organic<? super Elem2> compound = new Organic<Elem>(); 

你也可以做

<F> void react(F e) { 
} 

然后,你可以与野生卡

我不知道为什么要与野生卡

2

通过使用超工作,你所定义的下界你的类型参数的工作。你在说你的有机物体的实际类型是Elem2类型或它的一个超类型。因此,编译器取代了你的反应方法elem2时,这样

void react(Elem2 value) {} 

所以它的签名,你不能传递一个新的ELEM()到你的对象,因为这需要向下转换。

也就是说,你不能这样做,因为你不能将Number传递给需要Integer的方法。如果应用向下转换问题已解决。

public static void main(String[] args) { 
    Organic<Object> all = new Organic<Object>(); 
    Organic<? super Elem2> other = all; 

    Elem a = new Elem2(); 
    other.react((Elem2)a); 
} 

或者,你可以delcare它作为

Organic<? super Elem> other = ...; 

原本应该正常工作。