【发布时间】:2015-06-01 18:12:28
【问题描述】:
我有两个类A 和B 和一个方法B convertAToB(A a)。现在我想创建一个将A 的多维(甚至是单维)列表转换为B 的方法。例如:
- 给定一个
List<A>,它应该返回一个List<B> - 给定一个
List<List<A>>,它应该返回一个List<List<B>>
等等。我的转换方法不需要由编译器进行完全类型检查,原因很明显......该方法将自行进行类型检查。
在嵌套层次结构中没有空列表的情况下,这相当简单:
public static List<Object> convertAListToBList(List<Object> aList) {
List<Object> bList = new ArrayList<Object>();
for (Object obj : aList) {
if (obj instanceof A) {
bList.add(convertAToB((A)obj));
} else if (obj instanceof List) {
bList.add(convertAListToBList((List<Object>)obj));
} else {
throw new UnsupportedOperationException("Unknown object in hierarchy");
}
}
return bList;
}
但是,在有空列表的情况下,它变得有点复杂。例如,如果我们传入一个包含{{{a1, a2}, {a3, a4}}, {}} 的List<List<List<A>>>,那么我们将返回{{{b1, b2}, {b3, b4}}, {}}。这里外部列表中的第二个元素 ({}) 在参数中具有 List<List<A>> 类型,但实际上在返回值中只有 List<B> 类型。你能安全地将一个空列表从List<B> 转换为List<List<B>> 吗?我不知道,但无论如何,这种“可变深度”场景可以通过在递归方法中添加一个参数来跟踪达到的最大深度并确保所有空列表向下钻取到相同的深度来解决。但是,即使在运行时知道有多少维,我也不知道如何创建多维列表。例如,在这种情况下,我知道在运行时有两个维度,我想创建一个新的 ArrayList<ArrayList<Object>> 而不是 ArrayList<Object>,但我不知道如何以编程方式进行。
在从未达到最大深度的情况下,它变得更加复杂。例如,如果我传入一个仅包含{} 的List<List<A>> 类型的对象,那么我将返回一个仅包含List<B> 的List<B> 类型的对象@。我不知道是否有任何方法可以知道原始列表中有多少维度并创建适当的类型。
我是不是太担心了,因为所有这些东西都会在运行时被删除?
总结:
- 可以将空的
List<B>转换为List<List<B>>吗? - 有没有办法找出多维空列表的维数?
- 有没有办法在给定 n 的运行时返回一个空的 n 维列表(即最外面的列表为空)?
- 调用者是否知道由于类型擦除,我返回了“错误类型”的对象?
【问题讨论】:
标签: java list generics multidimensional-array casting