铸造Java ArrayList<;定制类>;到ArrayList<;对象>;
我正在尝试将类铸造Java ArrayList<;定制类>;到ArrayList<;对象>;,java,arraylist,Java,Arraylist,我正在尝试将类SomeClass的ArrayList转换为类对象的ArrayList。然后将对象的新ArrayList传递给函数。我目前做了以下工作: // convert ArrayList<SomeClass> to generic ArrayList<Object> Object[] objectArray = someClassList.toArray(); ArrayList<Object> objects = new ArrayList<O
SomeClass
的ArrayList
转换为类对象的ArrayList
。然后将对象的新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
}
//将ArrayList转换为通用ArrayList
Object[]objectArray=someClassList.toArray();
ArrayList对象=新的ArrayList();
for(int i=0;i
有没有更有效或更“标准”的方法?我所做的一开始就是“错误的”吗
将其转换为类对象的ArrayList
的目的是我创建了一个外部库来处理泛型对象的ArrayList
。如果您能够将函数的签名更改为获取ArrayList对象
(或者更好的是,List
而不是ArrayList
),您可以直接传递ArrayList
ArrayList
不是ArrayList
的原因是ArrayList
会接受您的add()
将任何类型的对象
放入其中,这不是使用ArrayList
可以做到的。另一方面,ArrayList由于创建了外部库,我认为修改函数签名以接受任何类型的列表会更容易。这可以使用?
:
public static void someFunction(List<?> objects) {
// whatever
}
公共静态函数(列出对象){
//随便
}
那么,您无需进行任何转换即可调用它:
public static void main(String[] args) {
List<String> words = new ArrayList<>();
someFunction(words);
}
publicstaticvoidmain(字符串[]args){
List words=new ArrayList();
功能(词);
}
此外,除非您有充分的理由不这样做,否则最好接受someFunction
中的任何列表,而不是将您的输入限制在ArrayList
s。这使您的代码更灵活,将来更容易更改。可以使用两个c以任意方式转换类型的类型参数asts:
ArrayList<SomeClass> l1 = ...;
ArrayList<Object> l2 = (ArrayList<Object>) (Object) l1;
ArrayList l1=。。。;
ArrayList l2=(ArrayList)(Object)l1;
但是,正如Aasmund Eldhuset在他的回答中所说:这可能不是一个好主意!最好为l2
指定一个更合适的类型,比如ArrayList
此代码向您提供一个编译警告,说明类型安全性:出于某种原因,未选中从对象强制转换到ArrayList
。例如,如果将字符串添加到l2
,然后有人读取l1
,并期望出现SomeClass
,他们将得到非常意外的ClassCastExceptionsi将列表
转换为列表
的一种简单方法是使用集合。不可修改列表(listOfSubFoos)
,它是完全类型安全的,实际上强制您不能对它做任何不好的事情(例如添加不同的subfoo
).您可以更改需要ArrayList
输入的库吗?它可能需要ArrayList
或List
之类的内容。为什么不直接通过转换传递原始的ArrayList
呢?您试图做什么外部处理?只需执行void someFunction(ArrayList对象)
。这实际上是一个对象列表。您不能在泛型类型之间转换:非常感谢。这为我进一步研究ArrayList的使用指明了正确的方向。我想补充一个事实,ArrayList
实际上是ArrayList的缩写