繁体   English   中英

将Java ArrayList <Custom Class>转换为ArrayList <Object>

[英]Casting Java ArrayList<Custom Class> to ArrayList<Object>

我试图给转换ArrayListSomeClass一个ArrayList类的Object 然后,这个新的Object ArrayList将传递给一个函数。 我目前做了以下事情:

// convert ArrayList<SomeClass> to generic ArrayList<Object>

Object[] objectArray = someClassList.toArray();
ArrayList<Object> objects = new ArrayList<Object>();

for (int i = 0; i < objectArray.length; i++) {
    objects.add(objectArray[i]);
}

someFunction(objects);

public void someFunction(ArrayList<Object> objects) {
    // do something with objects
}

这样做有更高效或“标准”的方式吗? 我首先做的是“错误”吗?

将它转换为Object类的ArrayList的目的是我创建了一个外部库来处理通用ObjectArrayList

如果您能够将函数的签名更改为采用ArrayList<? extends Object> objects ArrayList<? extends Object> objectsArrayList<?> objects (甚至更好, List而不是ArrayList ),您将能够直接传递ArrayList<SomeClass>

ArrayList<SomeClass> 不是 ArrayList<Object>ArrayList<Object>会接受你在其中add() 任何类型的Object ,这不是你可以用ArrayList<SomeClass>做的事情。 另一方面, ArrayList<? extends Object> ArrayList<? extends Object>允许您从列表中检索元素,但不能添加元素,因此可以安全地为其分配ArrayList<SomeClass>

由于您创建了外部库,我认为修改函数签名以接受任何类型的列表会更容易。 这可以使用无界通配符来完成?

public static void someFunction(List<?> objects) {
    // whatever
}

然后,您无需进行任何转换即可调用它:

public static void main(String[] args) {
    List<String> words = new ArrayList<>();
    someFunction(words);
}

另外,除非你有充分的理由不这样做,否则最好接受someFunction任何List ,而不是将输入限制为ArrayList 这使您的代码在未来更灵活,更易于更改。

可以使用两个强制转换以任意方式转换类型的类型参数:

ArrayList<SomeClass> l1 = ...;
ArrayList<Object> l2 = (ArrayList<Object>) (Object) l1;

但是,正如Aasmund Eldhuset在他的回答中所说: 这可能不是一个好主意! 最好给l2一个更合适的类型,比如ArrayList<?>

此代码为您提供编译警告,说明Type safetyThat: Unchecked cast from Object to ArrayList<Object>的原因。 例如,如果将一个String添加到l2 ,然后有人读取l1并期望SomeClass ,则会得到一个非常意外的ClassCastException

List<SubFoo>转换为List<Foo>一种简单方法是使用Collections.unmodifiableList(listOfSubFoos) ,这是完全类型安全的,并且实际上强制你不能做任何不好的事情(比如添加一个DifferentSubFoo )。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM