如何在java中强制转换泛型列表类型?

2022-09-03 03:29:38

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

我需要从LinkedList转换到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

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


答案 1

您不需要投射。 实现,所以你在这里没有强制转换。LinkedListList

即使您想向下转换为 a of s,也可以使用泛型来执行此操作,如以下代码所示:ListObject

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 泛型教程。希望这能澄清。


答案 2

这是我做选角的可怕解决方案。我知道,我知道,我不应该把这样的东西释放到野外,但它已经派上了用场,可以将任何物体投射到任何类型的类型:

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

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


推荐