2013-10-02 66 views
0

我想了解泛型如何工作並編寫了一個方法來測試它。泛型方法 - 傳遞對象並調用其方法

我已經創建的對象 - 飲料及其子對象咖啡......和定義泛型方法GO1()調用這兩個對象的SIP()方法...

我在Eclipse中運行並得到一個錯誤 - 說明方法sip()未定義類型V.

有人可以解釋如何處理?

class Drink{ 
    public void sip(){ 
     System.out.println("Im Drink method"); 
    } 
} 

class Coffee extends Drink{ 
    public void sip(){ 
     System.out.println("Im Coffee method"); 
    } 

} 

public class test{ 

    public static <V> V go1(V o){ 
     o.sip(); 

    } 

public static <V> void go(V v){ 
     System.out.println(v.hashCode()); 
    } 

    public static void main(String[] args) { 
     Drink s1 = new Drink(); 
     go1(s1); 

      int i = 10; 
     String j ="test"; 
     go(i); 
     go(j); 

    } 
} 

回答

3

只需添加範圍的類型參數:

public static <V extends Drink> void go1(V o){ 
    o.sip(); 
} 

有了約束類型參數,您可以訪問的界非靜態方法 - Drink在這種情況下,使用該參考類型參數。

編輯後:

對於通過StringInteger到你的方法,你能想到的共同上限將適合兩種。爲StringInteger常見的超是:

所以,你可以有三種界限:

  • <V extends Object>
  • <V extends Serializable>
  • <V extends Comparable<V>>

所以,你只需要修改你的go()方法,如:

public static <V extends Object> void go(V v){ 
    System.out.println(v.hashCode()); 
} 

參考文獻:

+0

它的工作fine..Can請你解釋一下去()方法可以單獨處理整數和字符串數據類型? – user1050619

+0

@ user1050619。想想「Integer」和「String」的常見超類型是什麼?將該類型作爲上限。例如'對象'。 –

+0

不是對象也是飲料的超類型? – user1050619

1

的問題是,普通<V>不能被理解爲Drink但作爲通用Object。您需要將泛型綁定到您的類Drink,因此請聲明泛型爲<V extends Drink>

更多信息:Generic Methods and Bounded Type Parameters

1

編譯器決定是否基於他們被稱爲該類型的方法調用是有效的。你有

public static <V> V go1(V o){ 
    o.sip(); 
} 

V是不是一個有界類型,因此編譯器只能確保它至少Object類型。 Object沒有sip()方法。你需要結合你的類型

public static <V extends Drink> V go1(V o){ 
    o.sip(); 
} 

這樣編譯器知道V至少Drink類型。 Drink有一個sip()方法。

1

只是爲了幫助你理解..

考慮到你的整體目標是進一步的泛型的理解,我只是想指出的是,一個簡單的接口或超類對象的引用將是一個更簡單解決您的問題。即:

public void go1(Drink d) 
{ 
    d.sip(); 
} 

泛型

的更典型的例子比方說,你已經有了一個對象,Pair。 Pair需要能夠容納Java中的任何東西,所以你可以使用Object這兩種類型的東西。那是什麼意思?這意味着你總是鑄造Object和所需的類型。所以你會怎麼做?你使用泛型。

public class Pair<F,S> 
{ 
    F first; 
    S second; 

    public Pair(F first, S second) 
    { 
      this.first = first; 
      this.second = second; 
    } 
} 

,而不必強制轉換,只需狀態現在:

Pair<Integer, String> pair = new Pair<Integer, String>(10, "Ten");