簡體   English   中英

如何讓 Java 方法返回任何類型的通用列表?

[英]How to have Java method return generic list of any type?

我想編寫一個方法,該方法將返回任何類型的java.util.List而無需進行任何類型轉換

List<User> users = magicalListGetter(User.class);

List<Vehicle> vehicles = magicalListGetter(Vehicle.class);

List<String> strings = magicalListGetter(String.class);

方法簽名會是什么樣子? 像這樣的東西,也許(?):

public List<<?> ?> magicalListGetter(Class<?> clazz) {
    List<?> list = doMagicalVooDooHere();

    return list;
}
private Object actuallyT;

public <T> List<T> magicalListGetter(Class<T> klazz) {
    List<T> list = new ArrayList<>();
    list.add(klazz.cast(actuallyT));
    try {
        list.add(klazz.getConstructor().newInstance()); // If default constructor
    } ...
    return list;
}

也可以為方法提供泛型類型參數。 您已經正確地推斷出需要正確的類實例來創建事物( klazz.getConstructor().newInstance() )。

甚至不需要通過課程:

public <T> List<T> magicalListGetter() {
    return new ArrayList<T>();
}

您可以使用舊方法:

public List magicalListGetter() {
    List list = doMagicalVooDooHere();

    return list;
}

或者你可以使用Object和所有東西的父類:

public List<Object> magicalListGetter() {
    List<Object> list = doMagicalVooDooHere();

    return list;
}

注意對於您將放入列表中的所有對象,也許有一個更好的父類。 例如, Number將允許您將DoubleInteger放入其中。

另一種選擇是執行以下操作:

public class UserList extends List<User>{

}

public <T> T magicalListGetter(Class<T> clazz) {
    List<?> list = doMagicalVooDooHere();
    return (T)list;
}

List<User> users = magicalListGetter(UserList.class);

`

讓我們將List<Object> objectList轉換為List<T>

public <T> List<T> list(Class<T> c, List<Object> objectList){        
    List<T> list = new ArrayList<>();       
    for (Object o : objectList){
        T t = c.cast(o);
        list.add(t);
    }
    return list;
}

像這樣的東西

publiс <T> List<T> magicalListGetter(Class<T> clazz) {
    List list = doMagicalVooDooHere();
    return list;
}

您可以簡單地轉換為 List,然后檢查是否每個元素都可以轉換為 T。

public <T> List<T> asList(final Class<T> clazz) {
    List<T> values = (List<T>) this.value;
    values.forEach(clazz::cast);
    return values;
}

我很確定您可以完全刪除 <stuff> ,這將生成警告,您可以使用 @ 抑制警告。 如果你真的希望它是通用的,但要使用它的任何元素,你將不得不進行類型轉換。 例如,我做了一個簡單的冒泡排序函數,它在對列表進行排序時使用了一個泛型類型,在這種情況下它實際上是一個 Comparable 數組。 如果您想使用某個項目,請執行以下操作: System.out.println((Double)arrayOfDoubles[0] + (Double)arrayOfDoubles[1]); 因為我將 Double(s) 填充到 Comparable(s) 中,這是多態性,因為所有 Double(s) 都繼承自 Comparable 以允許通過 Collections.sort() 輕松排序

        //INDENT TO DISPLAY CODE ON STACK-OVERFLOW
@SuppressWarnings("unchecked")
public static void simpleBubbleSort_ascending(@SuppressWarnings("rawtypes") Comparable[] arrayOfDoubles)
{
//VARS
    //looping
    int end      =      arrayOfDoubles.length - 1;//the last index in our loops
    int iterationsMax = arrayOfDoubles.length - 1;

    //swapping
    @SuppressWarnings("rawtypes")
    Comparable tempSwap = 0.0;//a temporary double used in the swap process
    int elementP1 = 1;//element + 1,   an index for comparing and swapping


//CODE
    //do up to 'iterationsMax' many iterations
    for (int iteration = 0; iteration < iterationsMax; iteration++)
    {
        //go through each element and compare it to the next element
        for (int element = 0; element < end; element++)
        {
            elementP1 = element + 1;

            //if the elements need to be swapped, swap them
            if (arrayOfDoubles[element].compareTo(arrayOfDoubles[elementP1])==1)
            {
                //swap
                tempSwap = arrayOfDoubles[element];
                arrayOfDoubles[element] = arrayOfDoubles[elementP1];
                arrayOfDoubles[elementP1] = tempSwap;
            }
        }
    }
}//END public static void simpleBubbleSort_ascending(double[] arrayOfDoubles)

給定一些返回無類型List的遺留代碼

List list = database.GetCustomers(); //legacy code returns untyped list

我們將使用一個輔助函數:

public static <T> @NotNull List<T> castList(final @NotNull Iterable sourceList)
{
    List<T> result = new ArrayList<>();
    for (Object o : sourceList)
        result.add((T)o);

    return result;
}

將返回的列表轉換為通用類型的List<T>

List<Customer> = castList(database.GetCustomers()); //cast the list the appropriate type

為什么 Java 沒有擴展方法完全超出了我的理解。

暫無
暫無

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

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