2009-10-14 34 views
0

試圖做一些事情,如:設置列表<?擴展接口1>

public interface Order {  
    public List<? extends OrderItem> getItems(); 
    public void setItems(List<? extends OrderItem> items); 
} 

public interface OrderItem { 
    // stuff 
} 

public class OrderItemImp implements OrderItem { 
    // stuff for class impl 
} 

public class OrderImp implements Order { 
    public List<OrderItemImp> getItems() { 
     return items; 
    } 
    public void setItems(List<OrderItemImp> items) { 
     this.items = items; 

    } 
} 

編譯器抱怨setItems方法。我該如何做這項工作?謝謝。

回答

5

在你的Order接口定義中,這些方法看起來像一對get/set方法,即邏輯上屬性。在這種情況下,他們需要具有相同的類型。你需要通過命名類型參數綁在一起:

public interface Order<T extends OrderItem> {  
    public List<T> getItems(); 
    public void setItems(List<T> items); 
} 

不能完全確定這是否是在Java中正確的語法,但基本上這兩種方法必須最終參照類型完全相同。

+3

而'公共類OrderImp實現訂單 {'。 – 2009-10-14 22:25:45

+0

完美!謝謝 – Fedor 2009-10-14 22:28:54

-1

嘗試

public <T> void setItems(List<T extends OrderItem> items); 

更換

public void setItems(List<? extends OrderItem> items); 

。現在這是一個generic method

+0

而'OrderImp'中的實現也應該是'setItems(List )'。沒有(簡單)的方法來確保這些項目實際上是'OrderItemImp'而不是'OrderItem'的其他一些實現。 – 2009-10-14 22:20:17

+1

你的語法不太對,它應該是'public void setItems(List items);' – Lachlan 2009-10-14 23:30:35

+0

-1語法無效。此外,此更改完全沒有影響 – user102008 2011-08-31 03:10:48