2009-05-25 38 views
13

那么,我有一个客户类(没有基类)。如何在java中转换泛型List类型?

我需要从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; 
    } 
} 

所以按照尤瓦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 

那么,什么是正确的方法来做这个演员?

+0

你应该给的代码示例从一开始的非泛型列表,这将不起作用,我会在第二秒内更新我的答案... – 2009-05-25 09:18:18

回答

25

你不需要施放。 LinkedList implements List所以你没有在这里做铸造。

即使要向下转换到ObjectList一个是你可以像下面的代码泛型做到这一点:现在

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 generics tutorial。希望澄清。

+0

你错过了我的观点。考虑:[code] LinkedList ll = someList;列表 l = ll [/ code]。这个可以吗?我的意思是这个。 – jrharshath 2009-05-25 09:08:28

+0

你说了什么,但问题依然存在。编辑该问题以添加代码示例和遇到的错误。 – jrharshath 2009-05-25 09:17:38

+0

好的,明白了。非常感谢:) – jrharshath 2009-05-25 09:27:49

0

的LinkedList实现List,因此可以实现

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

或者你想从链表<字符串投>列出< int>的?在这种情况下,您必须选取每个元素并将其转换为整数。

-1

List是一个接口,LinkedList是该接口的具体实现。 大多数隐式转换都可以工作,将一个LinkedList赋值给List,或者将它传递给期望List的函数,它应该只是“工作”。

如果需要,还可以进行显式强制转换。

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

//Also Valid 
List<Customer> myList = (List<Customer>) new LinkedList<Customer>(); 
1
> public List<Object> getList() 

为什么要退名单<对象>?你还不如返回列表(没有泛型),因为这是等效的,但是会使下面的代码工作:

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

public List getList() { 
    return theList; 
} 

列表之间的铸造用不同的泛型类型是棘手的,这里似乎没有必要。

当然,你应该返回类型列表<客户> ...

0

你应该从你的方法返回一个List<?>。直观上,getList()返回一个列表,以便调用者可以检索其中的项目。 List<?>(相当于List<? extends Object>)允许该功能。但是,您将无法通过返回的列表添加任何内容,因为这不是类型安全的;但我不认为这是你所需要的。

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

这是我做铸造的可怕解决方案。我知道,我知道,我不应该被释放这样的事情到野外,但它派上用场的铸造任何对象的任何类型:

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

现在我要祈求节目为我的罪的神...

0

只是把

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

我做了这个函数,该函数,丑陋,但它的工作原理

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

如果您的列表是一个通用型的如

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

,因为我前面提到它的工作原理如果对象包含通用的清单,如果你通过与混合型元素