如何在java中转换genericsList类型?

好吧,我有一个类Customer(没有基类)。

我需要从LinkedList转换为List。 有没有干净的方法来做到这一点?

只是你知道,我需要把它投到List。 没有其他类型可以做。 (我正在使用Slim和FitNesse开发测试夹具)。


编辑:好的,我想我需要在这里给出代码示例。

import java.util.*; public class CustomerCollection { protected LinkedList theList; public CustomerCollection() { theList = new LinkedList(); } public void addCustomer(Customer c){ theList.add(c); } public List getList() { return (List) theList; } } 

因此,根据Yuval A的评论,我终于以这种方式编写了代码。 但我得到这个错误:

 CustomerCollection.java:31: incompatible types found : java.util.List required: java.util.List return (List)theList; ^ 1 error 

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

你不需要施放。 LinkedList实现List因此您无法在此处执行转换。

即使您想要向下转换为Object List ,也可以使用generics来完成,如下面的代码所示:

 LinkedList ll = someList; List l = ll; // perfectly fine, no casting needed 

现在,在您编辑之后,我了解您正在尝试做什么,并且这是不可能的,而不是像这样创建一个新的List

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

我会解释为什么这是不可能的。 考虑一下:

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

有关更多信息,请参阅Sun Javagenerics教程 。 希望这澄清一下。

这是我做铸造的可怕解决方案。 我知道,我知道,我不应该将这样的东西发布到野外,但是将任何对象转换为任何类型都会派上用场:

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

用法:

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

现在我要为我的罪孽向编程之神祈祷……

我为此做了这个function,丑陋但它有效

 public static  Collection cast(Collection collection, Class clazz){ return (Collection)collection; } 
 > public List getList() 

你为什么要返回List ? 您也可以返回List(没有generics),因为这是等效的,但会使以下代码工作:

 LinkedList theList = new LinkedList(); public List getList() { return theList; } 

在具有不同generics类型的列表之间进行转换是棘手的,在这里似乎没有必要。

当然你应该返回类型List

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

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

或者您想从LinkedList 转换为List ? 在这种情况下,您必须选择每个元素并将其转换为整数。

您应该从方法返回List 。 直观地, getList()返回一个列表,以便调用者可以检索其中的项。 List (相当于List )允许该function。 但是,您将无法通过返回的列表将任何内容放入其中,因为这不是类型安全的; 但我不认为这是你需要的。

 public List getList() { return theList; } 

刚放好

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

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

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

然后下面的方法应该工作

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

如何使用它?

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

正如我前面提到的,如果Object包含generics列表,它将起作用,如果传递具有混合类型元素的非generics列表,这将不起作用

List是一个接口,LinkedList是该接口的具体实现。 很多时候隐式转换会起作用,将LinkedList分配给List,或者将它传递给期望List的函数,它应该只是“工作”。

如有必要,也可以进行显式演员表。

 //This is valid List myList = new LinkedList(); //Also Valid List myList = (List) new LinkedList();