2016-01-20 182 views
2

有很多類似錯誤的問題,但它們都不能解決我的問題。Java泛型:方法不適用於參數(T)

我只是想能夠重複使用相同的foo通用與各種bar方法。什麼是正確的方法來做到這一點?

public class Test { 

    static public <T> String foo(T object) { 
     return bar(object); 
    } 

    static public String bar(String object){ 
     return "string:" + object; 
    } 


    static public String bar(Integer object){ 
     return "integer:" + object; 
    } 


    public static void main(String[] args) throws Exception { 
     System.out.println(foo("blabla")); 
    } 
} 

我收到The method bar(String) in the type Test is not applicable for the arguments (T)編譯錯誤。

+0

這沒有任何意義。爲什麼不聲明兩個重載的'foo'函數呢? –

+0

當然,因爲你沒有傳遞'String',所以你會傳遞一個'不管怎麼樣'。而'bar()'並沒有聲明它可以採用'無論什麼碰巧'。我想也許你想要參數化類,而不是單個方法?例如,[像這樣](http://pastebin.com/WUA5wGA6)。 – aroth

+0

@SergeyTachenov那麼你打算寫兩個相同的'foo兩次嗎?' – VitoshKa

回答

1

您應該更新如下。由於功能無法知道類型它激發了錯誤

public class Test { 

    static public <T> String foo(T object) { 
     if(object instanceof String){ 
      return bar((String)object); 
     }else if(object instanceof Integer){ 
      return bar((Integer)object); 
     } 
     return null; 
} 

    static public String bar(String object){ 
     return "string:" + object; 
    } 


    static public String bar(Integer object){ 
     return "integer:" + object; 
    } 


    public static void main(String[] args) throws Exception { 
     System.out.println(foo("blabla")); 
    } 
} 
+0

那麼通用性有什麼意義呢?不妨聲明'foo(Object)'。事實上,這隻會增加混亂。 –

1

的問題是,TObject類型,所以,你可能每一個Java對象傳遞給foo。另一方面,您的bar方法的參數具有指定類型,在本例中爲StringInteger。你要做的是將Object傳遞給期望String的方法。由於Java不能自動向下播放類,所以會出現此錯誤。

你必須投T爲正確的類型,像這樣

public String foo(Object object) { 
    if(object instanceof String) 
     return bar((String)object); 
    if(object instanceof Integer) 
     return bar((Integer)object);  
    return null; 
} 
+1

再次,爲什麼它甚至是通用的?只需聲明'foo(Object)'。 –

+0

你說得對。沒有想到這一點。 – Kagemusha

相關問題