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

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/905964/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-11 20:53:36  来源:igfitidea点击:

How to cast generic List types in java?

javagenericscasting

提问by jrharshath

Well, I have a class Customer (no base class).

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

I need to cast from LinkedList to List. Is there any clean way to do this?

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

Just so you know, I need to cast it to List. No other type will do. (I'm developing a test fixture using Slim and FitNesse).

只是让您知道,我需要将其转换为 List。没有其他类型可以。(我正在使用 Slim 和 FitNesse 开发测试夹具)。



EDIT: Okay, I think I need to give code examples here.

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

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

So in accordance with Yuval A's remarks, I've finally written the code this way. But I get this error:

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

So, what's the correct way to do this cast?

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

采纳答案by Yuval Adam

You do not need to cast. LinkedListimplements Listso you have no casting to do here.

你不需要投射。LinkedList工具,List因此您无需在此处进行转换。

Even when you want to down-cast to a Listof Objects you can do it with generics like in the following code:

即使您想向下转换为 a Listof Objects,您也可以使用以下代码中的泛型来实现:

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

Now, after your edit I understand what you are trying to do, and it is something that is not possible, without creating a new Listlike so:

现在,在您编辑之后,我明白您要做什么,这是不可能的,而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
}

and I'll explain why this is not possible otherwise. Consider this:

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

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???

For more info, see the Sun Java generics tutorial. Hope this clarifies.

有关详细信息,请参阅Sun Java 泛型教程。希望这能澄清。

回答by Markus Lausberg

LinkedList implements List, so you can implement

LinkedList 实现了 List,所以你可以实现

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

Or do you want to cast from LinkedList< String > to List< int >? in this case you have to pick every single element and convert it to an integer.

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

回答by Nick

List is an interface, LinkedList is a concrete implementation of that interface. Much of the time an implicit cast will work, assign a LinkedList to a List, or pass it to a function expecting a List and it should just `work'.

List 是一个接口,LinkedList 是该接口的具体实现。大多数情况下,隐式强制转换将起作用,将 LinkedList 分配给 List,或将其传递给需要 List 的函数,它应该只是“工作”。

An explicit cast can also be done if necessary.

如有必要,也可以进行显式转换。

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

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

回答by Kris

>    public List<Object> getList()

Why are you returning List<Object>? You might as well return List (without generics) since that is equivalent but would make the following code work:

你为什么要返回 List<Object>?您不妨返回 List (没有泛型),因为它是等效的,但会使以下代码工作:

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

public List getList() {
    return theList;
}

Casting between Lists with different generic types is tricky and seems unnecessary here.

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

Of course you should be returning type List<Customer> ...

当然你应该返回类型 List<Customer> ...

回答by newacct

You should return a List<?>from your method. Intuitively, getList()returns a list so that the caller can retrieve the items inside. List<?>(which is equivalent to List<? extends Object>) allows that functionality. However, you won't be able to put anything into it via the returned list, because that would not be type safe; but I don't think that is what you need anyway.

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

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

回答by logan

Here's my horrible solution for doing casting. I know, I know, I shouldn't be releasing something like this into the wild, but it has come in handy for casting any object to any type:

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

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

}

Usage:

用法:

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

Now I'm going to pray to the gods of programming for my sins...

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

回答by Ravi Parekh

just put

就放

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

回答by julman99

I did this function for that, ugly but it works

我为此做了这个功能,丑陋但有效

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

回答by Vishal

If your list is of a generic type for eg

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

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

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

then Following method should work

那么以下方法应该有效

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

How to use it?

如何使用它?

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

as I mentioned before it works if the Object contains generic list, this won't work if you pass a non-generic list with mixed type of elements

正如我之前提到的,如果对象包含通用列表,它就可以工作,如果您传递具有混合类型元素的非通用列表,这将不起作用