2012-10-10 46 views
1

我想在我的一個項目中定義泛型靜態方法。 要求將方法返回類型作爲方法參數之一。下面在Java中定義泛型方法的最佳方式是什麼?

是我的解決方案。

public static <T> List<T> convertMapToAttribute(Class<T> attrClass, T attr) { 
    List<T> list = null; 
    if (attrClass.equals(String.class)) { 
     list = (List<T>) new ArrayList<String>(); 
     list.add(attr); 
    } else if (attrClass.equals(Integer.class)) { 
     list = (List<T>)new ArrayList<Integer>(); 
     list.add(attr); 
    } 
    return list; 
} 

我有兩個問題。

  1. 我們能夠避免這種華林「警告:未選中]選中投」 無添加@SuppressWarnings(「未登記」)?
  2. 有沒有辦法解決這個問題,上述任何其他優雅的方式

回答

1

通過具有Class<T>作爲參數,做一個檢查轉換(並跳過煩人的警告)的方法是調用attrClass.cast()如果鑄造失敗,這將引發ClassCastException。在這種情況下,T應該是StringInteger

這裏的問題是,你正在做從T列表的選中投地的任何StringInteger列表時,你應該使用強制直接定義列表和添加的元素:

if (attrClass.equals(String.class)) { 
    List<String> list = new ArrayList<String>(); 
    list.add(attrClass.cast(attr)); 
} 

Integer也是如此。

有一些奇怪的與您的方法堅韌(我不明白的意圖,實際上),您要創建從類型元素,你也傳遞參數的列表...不應該在該工作以及? (因爲你創建T類型的列表,並添加T類型的元素)。

public static <T> List<T> convertMapToAttribute(T attr) { 
    List<T> list = new ArrayList<T>(); 
    list.add(attr); 
    return list; 
} 
5

以下罰款應該工作:

List<T> list = new ArrayList<T>(); 
List<T> list = new ArrayList<>(); // Java 7 
4

你不能只是做類似...

public static <T> List<T> convertMapToAttribute(Class<T> attrClass, T attr) { 
    List<T> list = new ArrayList<T>(1); 
    list.add(attr); 
    return list; 
} 

取而代之?

更新基於反饋

public static <T> List<T> convertMapToAttribute(T attr) { 
    List<T> list = new ArrayList<T>(1); 
    list.add(attr); 
    return list; 
} 
+0

事實上,這個版本根本不需要'attrClass'參數。 –

+0

@LouisWasserman非常真實 – MadProgrammer

0
  1. 據我所知

  2. 跳過attrClass參數,因爲它實際上使得該方法不通用。

相關問題