铸造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
,他们将得到非常意外的
ClassCastException

si将
列表
转换为
列表
的一种简单方法是使用
集合。不可修改列表(listOfSubFoos)
,它是完全类型安全的,实际上强制您不能对它做任何不好的事情(例如添加
不同的subfoo
).

您可以更改需要
ArrayList
输入的库吗?它可能需要
ArrayList
List
之类的内容。为什么不直接通过转换传递原始的
ArrayList
呢?您试图做什么外部处理?只需执行
void someFunction(ArrayList对象)
。这实际上是一个对象列表。您不能在泛型类型之间转换:非常感谢。这为我进一步研究ArrayList的使用指明了正确的方向。我想补充一个事实,
ArrayList
实际上是
ArrayList的缩写