[英]Casting Java ArrayList<Custom Class> to ArrayList<Object>
我试图给转换ArrayList
类SomeClass
一个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
的目的是我创建了一个外部库来处理通用Object
的ArrayList
。
如果您能够将函数的签名更改为采用ArrayList<? extends Object> objects
ArrayList<? extends Object> objects
或ArrayList<?> 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.