簡體   English   中英

如何在 java 中轉換泛型列表類型?

[英]How to cast generic List types in java?

好吧,我有一個 class 客戶(沒有基類)。

我需要從 LinkedList 轉換為 List。 有什么干凈的方法可以做到這一點嗎?

正如你所知,我需要將其轉換為 List。 沒有其他類型會做。 (我正在使用 Slim 和 FitNesse 開發測試夾具)。


編輯:好的,我想我需要在這里給出代碼示例。

import java.util.*;
public class CustomerCollection
{
    protected LinkedList<Customer> theList;

    public CustomerCollection()
    {
        theList = new LinkedList<Customer>();
    }

    public void addCustomer(Customer c){ theList.add(c); }
    public List<Object> getList()
    {
        return (List<? extends Object>) theList;
    }
}

所以按照Yuval A的說法,我終於把代碼寫成這樣了。 但我收到此錯誤:

CustomerCollection.java:31: incompatible types
found   : java.util.List<capture#824 of ? extends java.lang.Object>
required: java.util.List<java.lang.Object>
        return (List<? extends Object>)theList;
               ^
1 error

那么,進行此轉換的正確方法是什么?

你不需要施放。 LinkedList實現List因此您無需在此處執行轉換。

即使您想要向下轉換為Object List ,也可以使用泛型來完成,如下面的代碼所示:

LinkedList<E> ll = someList;
List<? extends Object> l = ll; // perfectly fine, no casting needed

現在,在您編輯之后,我了解您正在嘗試做什么,並且這是不可能的,而不是像這樣創建新的List

LinkedList<E> ll = someList;
List<Object> l = new LinkedList<Object>();
for (E e : ll) {
    l.add((Object) e); // need to cast each object specifically
}

我會解釋為什么這是不可能的。 考慮一下:

LinkedList<String> ll = new LinkedList<String>();
List<Object> l = ll; // ERROR, but suppose this was possible
l.add((Object) new Integer(5)); // now what? How is an int a String???

有關更多信息,請參閱Sun Java泛型教程 希望這澄清一下。

這是我做鑄造的可怕解決方案。 我知道,我知道,我不應該將這樣的東西發布到野外,但是將任何對象轉換為任何類型都會派上用場:

public class UnsafeCastUtil {

    private UnsafeCastUtil(){ /* not instatiable */}

    /**
    * Warning! Using this method is a sin against the gods of programming!
    */
    @SuppressWarnings("unchecked")
    public static <T> T cast(Object o){
        return (T)o;
    }

}

用法:

Cat c = new Cat();
Dog d = UnsafeCastUtil.cast(c);

現在我要為我的罪孽向編程之神祈禱......

我為此做了這個功能,丑陋但它有效

public static <T> Collection<T> cast(Collection<? super T> collection, Class<T> clazz){
    return (Collection<T>)collection;
}
>    public List<Object> getList()

你為什么要返回List <Object>? 您也可以返回List(沒有泛型),因為它是等效的,但會使以下代碼工作:

LinkedList<Customer> theList = new LinkedList<Customer>();

public List getList() {
    return theList;
}

在具有不同泛型類型的列表之間進行轉換是棘手的,在這里似乎沒有必要。

當然你應該返回類型List <Customer> ...

如果您的列表是通用類型,例如

ArrayList<String> strList = new ArrayList<String>(); strList.add("String1"); Object o = strList;

然后下面的方法應該工作

public <T> List<T> getListObjectInBodyOfType(Class<T> classz, Object body) {
    if(body instanceof List<?>){
        List<?> tempList = (List<?>)body;
        if(tempList.size() > 0 && tempList.get(0).getClass().equals(classz)){
            return (List<T>) body;
        }
    }
    return new ArrayList<T>();
}

如何使用它?

List<String> strList1 = getListObjectInBodyOfType(String.class, o);

正如我之前提到的,如果Object包含泛型列表,它將起作用,如果傳遞具有混合類型元素的非泛型列表,這將不起作用

剛放好

public static List<Object> getList() {
    List l = test;
    return l;
}

基於julman99 的回答

@SuppressWarnings("unchecked")
public <T> List<T> cast(List<? super T> list){
    return (List<T>) list;
}

LinkedList實現List,因此您可以實現

List< String > list1 = new LinkedList< String >(); 

或者您想從LinkedList <String>轉換為List <int>? 在這種情況下,您必須選擇每個元素並將其轉換為整數。

您應該從方法返回List<?> 直觀地, getList()返回一個列表,以便調用者可以檢索其中的項。 List<?> (相當於List<? extends Object> )允許該功能。 但是,您將無法通過返回的列表將任何內容放入其中,因為這不是類型安全的; 但我認為這不是你需要的。

public List<?> getList()
{
    return theList;
}

List是一個接口,LinkedList是該接口的具體實現。 很多時候隱式轉換會起作用,將LinkedList分配給List,或者將它傳遞給期望List的函數,它應該只是“工作”。

如有必要,也可以進行顯式演員表。

//This is valid
List<Customer> myList = new LinkedList<Customer>();

//Also Valid
List<Customer> myList = (List<Customer>) new LinkedList<Customer>();

暫無
暫無

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

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