2012-06-29 141 views
0

我有一個通用的方法,例如:如何在Java泛型方法中定義返回類型?

public static<T> T execute(...) { 
    ... 
} 

我如何定義是在方法體中是什麼類型T?例如:

if (T == String) { 
    // do something with strings 
    // return string; 
} 
if (T == Bitmap) { 
    // do something with bitmap 
    // return bitmap; 
} 

我嘗試以下,但它沒有工作:

T par = null; 
if(par instanceof String) { 
    // do something with strings 
    // return string; 
} 

我想聲明par像下面,但也不能工作。

T par = (T) null; 
T par = (T) new Object(); 
+10

如果你需要這樣做,這聽起來像你不想要泛型。 –

+0

http://stackoverflow.com/questions/5734720/java-generics-obj-instanceof-t?rq=1 看看這個 –

+3

也許你正在尋找重載一個函數,而不是泛型?有一個方法'執行(String s)'和另一個'執行(BitMap b)'? – Thomas

回答

2

你也許可以做這樣的事情:

public static <T> T execute(Class<T> t) { 
    if(String.class == t) { 

    } 
} 
0

牛逼這裏素有類型參數。

//此處將方法去()

public interface Comparable<T> { 


     public int compareTo(T t) { 

      // do something... 

     } 
     } 

對於例如定義T的類型:

我有一個類歌曲,我想在歌曲排序其標題的基礎。

public class Song implements Comparable<Song> { 

    private String title; 

    public void compareTo(Song s) { 

     title.compareTo(s.title()); 

    } 

    public void setTitle(String s) { 

    this.title = s; 

    } 

    public void getTitle() { 

    return this.title; 
    } 

    public String toString() { 

    return getTitle(); 

    } 

} 
1

如果你的代碼只支持一組離散的數據類型,你不想使用泛型。正如原始帖子的評論中所述,這種情況要求重載的方法調用。

舉個例子,在那裏你支持字符串,整數和雙打,但你沒有其他數據類型的特定邏輯的情況。你需要定義你的方法,如:

public static String execute(String s) { ... } 
public static Integer execute(Integer i) { ... } 
public static Double execute(Double d) { ... } 
public static Object execute(Object o) { ... } 

前三種方法將定義邏輯的三個離散的數據類型,你支持,而最終會定義邏輯和/或錯誤處理的任何其他數據你不支持的類型。 (當然,這並不能掩蓋不是int或double類型的圖元,但是這只是一個例子。)

泛型最初添加到Java,支持收集準確知道它包含。例如,這是一種保證列表僅保留字符串的方式,例如聲明它爲List<String>。然後擴展了這個能力,但是保留了基本概念 - 保證如果你放入一個未知的X類型對象,即使你不知道在編譯時X是什麼,你也可以編寫邏輯來得到相同類型的X出。 (This article是一個有趣的閱讀,如果過時。)

這並不意味着它應該使用其中一個方法或類應用的邏輯是依賴於輸入的數據類型。它應該被使用的地方不是的問題傳入的數據類型,並且相同的邏輯將一致地應用於未知的數據類型X.所以如果你有不同的字符串邏輯比雙倍,你不應該使用仿製藥。

tl; dr: 由於原始文章基於輸入參數的數據類型指示了不同的邏輯,因此泛型不適合使用。應該使用基於支持的數據類型重載execute方法。

+0

的選擇我明白,但如果我需要: 'code'public static String execute(String s){... } public static Integer execute(String s){...} public static Double execute(String s){...} public static Object execute(String s){...}'code' All depends在字符串是什麼。如果字符串是圖片網址,我想獲取位圖或可繪製。如果字符串是XML或JSON的URL,我想得到它。 – bvitaliyg

+0

什麼是強迫你使用泛型?這是功課嗎? –

0

如果你已經用代碼拆分了功能,並且輸入是相同的,那麼你可能會得到不同的功能。因此,而不是(用耶書侖的答案)

public static <T> T execute(Class<T> t) 
{ 
    if(String.class == t) { 

    } 
} 

BitMap b = execute(BitMap.class); 

你將不得不

public BitMap bitmapExecute(...) 
{ 
    commonWork(); 
    //do bitmap stuff 
} 

public String stringExecute(...) 
{ 
    commonWork(); 
    //do String stuff 
} 

BitMap b = bitmapExecute(...); 
String s = stringExecute(...); 

如果有共同的一大塊代碼,只有不同的基於類型的一小部分,你可以移動通用代碼到它自己的功能。

public someObject commonWork(...) 
{ 
    //Do common stuff 
} 

只要你所做的關於在編譯時的類型決定的,你不應該有instanceof塊。

相關問題