将List <object>转换为List <customclass>

时间:2015-05-26 15:57:33

标签: java

我正在返回List只有Object类型的对象。但是我知道在这种情况下这些对象属于CustomClass类。

当我尝试将原始列表转换为CustomClass时,我收到错误。

这就是我目前正在解决这个问题的方法,但是我不喜欢我只有for loop这样做的事实。

List<Object> objects = getObjects();
List<CustomClass> customObjects = new ArrayList<>();
        for ( Object object : objects ) {
            if ( object instanceof CustomClass )
                customObjects.add( (CustomClass) object );
        }

有什么想法吗?

4 个答案:

答案 0 :(得分:8)

如果您事先知道所有对象实际上都是CustomClass个对象,则可以执行不安全的转换:

@SuppressWarnings("unchecked")
List<CustomClass> list = (List<CustomClass>)(List<?>)getObjects();

这是最快的解决方案;几乎在运行时,除变量赋值外,不会执行任何操作。但是,如果您出错并且您的列表实际上包含其他对象,则稍后可能会出现意外ClassCastException

答案 1 :(得分:2)

如果您绝对确定您的列表仅包含CustomClass个对象,则可以执行此操作,并在此过程中消除大量警告

// Note, absense of generic parameter here, this is a first warning you will see
List genericList = getObjects( );

// Expect another 'unchecked' warning here
List< CustomClass > typedList = (List<CustomClass>) genericList;

答案 2 :(得分:1)

如果你发现自己经常进行这种过滤/转换,你可以编写自己的类型安全通用方法:

List<Object> objects = getObjects();
List<CustomClass> customObjects = myFilter(objects, CustomClass.class);

static <E> List<E> myFilter(List<?> lst, Class<E> cls) {
    List<E> result = new ArrayList<E>();
    for (Object obj : lst) {
        if (cls.isInstance(obj))
            result.add(cls.cast(obj));
    }
    return result;
}

答案 3 :(得分:1)

一些提示: 准备List时,请确保将CustomClass个对象添加到列表中。

customObjects.add( (CustomClass) object );

从方法getObjects()返回对象时,这将返回CustomClass的列表,而不是Object的列表。

List<CustomClass> objects = getObjects();

希望这有帮助。