好吧,我有一个Customer类(没有基类)。
我需要从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
那么,这个演员的正确方法是什么?
答案 0 :(得分:29)
你不需要施放。 LinkedList
实现了List
,因此您无法在此处进行投射。
即使您希望向下投射到List
Object
,您也可以使用以下代码中的泛型:
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。希望这澄清。
答案 1 :(得分:19)
这是我做铸造的可怕解决方案。我知道,我知道,我不应该将这样的东西发布到野外,但它可以派上用场任何类型的任何对象:
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);
现在我要为我的罪孽向编程之神祈祷......
答案 2 :(得分:2)
我为此做了这个功能,丑陋但是有效
public static <T> Collection<T> cast(Collection<? super T> collection, Class<T> clazz){
return (Collection<T>)collection;
}
答案 3 :(得分:1)
> public List<Object> getList()
为什么要返回List&lt; Object&gt;?您也可以返回List(没有泛型),因为这是等效的,但会使以下代码工作:
LinkedList<Customer> theList = new LinkedList<Customer>();
public List getList() {
return theList;
}
在具有不同泛型类型的列表之间进行转换非常棘手,在此处似乎没有必要。
当然你应该返回类型List&lt; Customer&gt; ...
答案 4 :(得分:0)
LinkedList实现List,因此您可以实现
List< String > list1 = new LinkedList< String >();
或者你想从LinkedList&lt;字符串&gt;列出&lt; int&gt ;?在这种情况下,您必须选择每个元素并将其转换为整数。
答案 5 :(得分:0)
您应该从方法中返回List<?>
。直观地,getList()
返回一个列表,以便调用者可以检索其中的项目。 List<?>
(相当于List<? extends Object>
)允许该功能。但是,您将无法通过返回的列表将任何内容放入其中,因为这不是类型安全的;但我认为这不是你所需要的。
public List<?> getList()
{
return theList;
}
答案 6 :(得分:0)
刚刚放
public static List<Object> getList() {
List l = test;
return l;
}
答案 7 :(得分: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);
正如我之前提到的,如果Object包含泛型列表,它可以工作,如果你传递一个混合类型元素的非泛型列表,这将无法工作
答案 8 :(得分:-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>();