簡體   English   中英

用Java定義泛型方法的最佳方法是什么?

[英]What is the best way to define Generic Method in 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(“ unchecked”)的情況下避免發出“警告:[unchecked] unchecked cast”警告?
  2. 還有其他優雅的方法可以解決上述問題

以下應該可以正常工作:

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

你不能只是做...

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;
}

通過將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;
}
  1. 據我所知

  2. 跳過attrClass參數,因為它實際上使方法非泛型。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM