2012-01-20 58 views
1

我有這樣的以下接口:使用類型轉換和泛型在Java

public interface FruitDetails { 
      public String getFruitName(); 
    } 

和少量的類實現上述接口:

public class Banana implements FruitDetails{ 

     private int index; 
      public Banana(int i) { 
       index = i; 
     } 

     @Override 
     public String getFruitName() { 
      return "Banana Fruit " + index; 
     } 

    } 

public class Apple implements FruitDetails{ 

     private int index; 
      public Apple(int i) { 
       index = i; 
     } 

     @Override 
     public String getFruitName() { 
      return "AppleFruit " + index; 
     } 

    } 

我有一個功能打印水果的細節:

現在
static void getFruitDetails(List<FruitDetails> fruits) { 
      for (FruitDetails fruitDetails : fruits) { 
        System.out.println(fruitDetails.getFruitName()); 
      } 
    } 

我將創建香蕉的列表:

List<Banana> bananaList = new ArrayList<Banana>(); 
    bananaList.add(new Banana(0)); 
    bananaList.add(new Banana(1)); 

現在我想打印香蕉細節在使用getFruitDetails上面的列表中。

問題是,如果試圖調用

getFruitDetails(bananaList); 

我收到編譯時錯誤:

The method getFruitDetails(List<FruitDetails>) in the type MainClass is not applicable for the arguments (List<Banana>) 

我怎麼能解決這個問題。

而且還需要定義getFruitDetails這樣,我應該能夠打印香蕉列表或蘋果列表

+0

也許這是我的強迫症,但它會很好,如果界面被稱爲水果,而不是FruitDetails :-) – Rahul

回答

5

接受FruitDetails的所有執行類爲getFruitDetails參數的詳細信息,您需要使用類型List<? extends FruitDetails>

static void getFruitDetails(List<? extends FruitDetails> fruits) { 
     for (FruitDetails fruitDetails : fruits) { 
       System.out.println(fruitDetails.getFruitName()); 
     } 
} 

有一個副作用,這使得列表fruitsgetFruitDetails只爲JB Nizet描述了評論的原因有效地讀取。

+0

只是爲了解釋(再次):如果列表是列表,您可以添加一個蘋果到列表,從而打破了名單的類型安全性。 –

+0

但我有FruitDetails作爲接口。 – Pavan

+0

這是正確的。對不起,我的印象是,作爲FruitDetails是一個**接口**,表達**「?擴展FruitDetails」**應該是**「?實現FruitDetails」**這是給錯誤。我也可以知道這是如何工作的。 – Pavan

1

這是因爲您不能將List<Banana>分配給List<FruitDetails>。嘗試將代碼更改爲

static void getFruitDetails(List<? extends FruitDetails> fruits) { 
     for (FruitDetails fruitDetails : fruits) { 
       System.out.println(fruitDetails.getFruitName()); 
     } 
} 

你應該閱讀約generics subtyping瞭解這一點。

+0

Again FruitDetails不是Base類。它的一個接口 – Pavan