2016-04-23 50 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

@波希米亞你是對的,我說得很差,我沒有打擾改變它。 –

相關問題