2016-04-29 46 views
1

是否有可能使一個方法通用而不使類通用? 無論如何要使用泛型類型來實現以下功能嗎?是否有可能使方法通用,而不使類通用返回列表<T>

下面的代碼不能編譯,這只是爲了展示我想實現的目標。

public class Test { 

    public List<T> execute(String name, Map<String, Object> params, List<T> type) { 
      List<Object> emps = new ArrayList<Object>(); 
      emps.add(new Employee()); 
     //emps object will be generated dynamically 
     return (List<T>)emps; 
    } 

    public static void main(String[] args) { 
     Test test = new Test(); 
     test.execute("testing", null, new ArrayList<Employee>()); 
    } 
} 

回答

2

試試這個:

public <T> List<T> execute(String name, Map<String, Object> params, List<T> type) { 
    List<Object> emps = new ArrayList<Object>(); 
    emps.add(new Employee()); 
    //emps object will be generated dynamically 
    return (List<T>) emps; 
} 

在這個解釋有一個看看:

Java編譯器需要目標打字的優勢來推斷類型的通用方法調用的 參數。表達式的目標類型是Java編譯器所期望的數據類型,取決於表達式出現的位置 。考慮方法 Collections.emptyList,其聲明如下:

static <T> List<T> emptyList();考慮下面的分配 聲明:

List<String> listOne = Collections.emptyList();這種說法是 期待的List<String>;一個實例該數據類型是目標 類型。由於方法emptyList返回List<T>, 類型的值,因此編譯器推斷類型參數T必須是值String。 這工作在Java SE 7和8或者兩者,你可以使用一個 類型證人如下指定T的值:

List<String> listOne = Collections.<String>emptyList();

https://docs.oracle.com/javase/tutorial/java/generics/genTypeInference.html

3

是的,你可以定義通過使用<T>表示法將其聲明爲泛型的方法在非泛型類中是泛型的。

簡單的改變方法簽名:

public <T> List<T> execute(String name, Map<String, Object> params, List<T> type) 

而且該方法將返回T類型的通用List對象。

0

試試下面它應該工作

public List<?> execute(String name, Map<String, Object> params, List<?> type) { 

} 
相關問題