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

7

我正在尝试将一个类为SomeClassArrayList 转换成一个类为ObjectArrayList。这个新的ArrayList of Object将会被传递给一个函数。目前,我已经完成了以下步骤:

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

有没有更有效或“标准”的方法来做这件事?我一开始做的是“错误”的吗?

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


4
你能否更改需要 ArrayList<Object> 输入的库?它可能应该采用类似于 ArrayList<?> 或者 List<?> 这样的形式。 - user2357112
为什么不直接传递原始的 ArrayList<Something>,带一个转换? - Kayaman
你想要进行什么外部处理? - brso05
只需执行 void someFunction(ArrayList<?> objects)。这实际上是一个对象列表。您无法在泛型类型之间进行转换:https://dev59.com/JHE85IYBdhLWcg3wgDvd - zapl
非常感谢。这为我指明了ArrayList <?>的使用方面需要进一步研究的正确方向。 - Acadian_Ghost
4个回答

7
如果您能将函数签名更改为接受一个 ArrayList<? extends Object> objectsArrayList<?> objects(或者更好的是,用 List 代替 ArrayList),那么您就可以直接传递您的 ArrayList<SomeClass>ArrayList<SomeClass> 不是 ArrayList<Object> 的原因是,ArrayList<Object> 可以让您向其中 add() 任何类型的 Object,而这是不能在 ArrayList<SomeClass> 中实现的。另一方面,ArrayList<? extends Object> 可以从列表中检索元素但不能添加元素,因此可以安全地将 ArrayList<SomeClass> 分配给它。

1
我想补充一下,ArrayList<?> 实际上是 ArrayList<? extends Object> 的缩写,它们表示完全相同的类型。 - Lii

1
自从您创建了这个外部库,我认为将函数签名更改为接受任何类型的列表会更容易。这可以使用 未限定通配符 ? 来实现:
public static void someFunction(List<?> objects) {
    // whatever
}

那么你无需进行任何转换即可调用它:
public static void main(String[] args) {
    List<String> words = new ArrayList<>();
    someFunction(words);
}

此外,除非您有充分的理由不这样做,最好接受任何类型的List作为someFunction的输入,而不是仅限于ArrayList。这样可以使您的代码更加灵活,未来更易于修改。

0
List<SubFoo> 转换为 List<Foo> 的简单方法是使用 Collections.unmodifiableList(listOfSubFoos),这是完全类型安全的,并且实际上强制执行您不能对其进行任何不良操作(例如添加 DifferentSubFoo)。

0

通过两个转换,可以以任意方式转换类型中的类型参数:

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


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