2016-04-23 51 views
0

我有两个类这样问题与泛型和<E扩展...>

public class Wire<E extends Electricity> implements Connection<E> { 
    private ArrayList<Inlet<E>> outlets = new ArrayList<Inlet<E>>(); 

    public void outputToAll() {  
     for (Inlet<E> inlet : outlets){ 
      inlet.addToStore(new Electricity(amountPer)); 
     } 
    } 
} 

public abstract class Inlet<E> {  
    private E store; 

    public void addToStore(E inputObj){ 
     this.store.add(inputObj); 
    } 
} 

入口没有任何错误,但电线给我的错误

在类型的方法addToStore(E)入口是不适用的参数(电力)

但是,由于在outputToAll中E必须扩展电力,所以Inlet至少是Inlet,为什么将一个Electricity对象传递给addToStore不起作用?

如果编译器不够聪明,无法知道这会起作用,什么是一个好的解决方法?

+5

好吧,它不能总是工作。你在说'进口'是一个'入口','E延伸电力'。但是当“E”可能不同时(“电力”的一个子类),你试图给它一个“电力”。 – Tunaki

+0

可能的重复[Is List List 的子类?为什么不是Java的泛型隐含多态?](http://stackoverflow.com/questions/2745265/is-listdog-a-subclass-of-listanimal-why-arent-javas-generics-implicitly-p) –

回答

2

您不需要Wire类是通用的,因为它看起来像你想要做的。

如果你只是有:

public class Wire implements Connection<Electricity> { 
    private ArrayList<Inlet<Electricity>> outlets = new ArrayList<Inlet<Electricity>>(); 

    public void outputToAll() {  
     for (Inlet<Electricity> inlet : outlets){ 
      inlet.addToStore(new Electricity(amountPer)); 
     } 
    } 
    ... 
} 

这个类(可能,因为我看不到它的其余部分)为Electricity子类工作太,由于Liskov substitution principle

+0

嗯那就是真正。我会经历,看看这种变化是否会奏效。 – multitaskPro

+0

您的意思是“您不需要*有界*泛型”?答案中仍然有泛型。 – Bohemian

+0

@波希米亚你是对的,我说得很差,我没有打扰改变它。 –