将List<Object>转换为List<CustomClass>

6

我正在返回一个只包含类型为Object的对象列表。但是我知道这些对象在这种情况下属于CustomClass类。

当我尝试将原始列表转换为CustomClass时,会出现错误。

目前,我通过使用for循环来解决这个问题,虽然它可以工作,但我不喜欢这样做。

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

有什么想法吗?

3
你能否更新你的 getObjects() 方法,使其返回 List<CustomClass> - Luiggi Mendoza
1
我非常确定这是一个重复的问题(虽然没有搜索“它”)。然而,这是通常的做法(尽管它可以被泛化,例如有一个实用方法像 List<Custom> c = filter(objects, Custom.class);). - Marco13
这里有一个相关的编程问题:https://dev59.com/ZHNA5IYBdhLWcg3wgeId。然而,你不应该使用那里的“被采纳的答案”(这怎么可能得到这么多赞?) - Marco13
@Marco13。这个hack是明确允许的,以便与现有的非泛型库向后兼容。看起来这里的OP有使用这个hack的有效案例。 - Alexander Pogrebnyak
@AlexanderPogrebnyak和@biziclop,这里有什么替代方法吗?这是一种从数据库获取行列表的方法,我传入一个特定类型的工厂,用于创建我的“CustomClass”对象。 - StuStirling
显示剩余5条评论
4个回答

13

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

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

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


3

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

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

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
一些提示: 在准备 List 时,请确保将 CustomClass 对象添加到列表中。
customObjects.add( (CustomClass) object );

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

List<CustomClass> objects = getObjects();

希望这能帮到您。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接