将原始矢量转换为类型安全列表(Arraylist)的最佳方法是什么?

时间:2014-02-03 08:55:23

标签: java generics vector arraylist

我有一个返回原始矢量的函数。我知道向量中的所有元素都是字符串,但代码仍然是出于遗留原因。我想从这些数据中得到一个arraylist。

一种天真的方法是迭代向量并将元素添加到列表中。是否有任何简短的方法可以防止循环。或者可以是实现此目的的直接功能。

编辑:

示例:

Vector f1() {}  //f1 returns raw vector

我想实现以下目标:

List<String> l = new ArrayList<String>();
Vector vec = f1();
for(Object obj: vec) {
    l.add((String) obj);
}

注意:我没有检查上面的代码是否编译。请将其视为伪代码

1 个答案:

答案 0 :(得分:7)

如果你100%确定Vector只包含字符串,最简单的方法是:

List<String> list = new ArrayList<>(vector);

请注意,即使Vector包含其他类型的对象,这也将编译并运行正常。但是这个:

list.get(i);
如果第i个元素不是String,

将抛出ClassCastException

由于您有一个原始Vector,您将收到警告。如果你想摆脱它们,你可以使用:

@SuppressWarnings(value = {"unchecked", "rawtypes"})
public static List<String> rawVectorToList(Vector v) {
    return new ArrayList<>(v);
}

快速检测转换问题的另一种方法是手动复制数组(复制构造函数在引擎盖下执行的操作):

Vector v = ...;
String[] elements = Arrays.copyOf(v.toArray(), v.size(), String[].class);
List<String> list = Arrays.asList(elements);

或者如果您需要列表是可变的:

List<String> list = new ArrayList<> (Arrays.asList(elements));

这样做的好处是可以在复制时检查类型。