Ama*_*tam 2 java generics vector arraylist
我有一个返回原始向量的函数.我知道向量中的所有元素都是字符串,但代码仍然是出于遗留原因.我想从这些数据中得到一个arraylist.
一种天真的方法是迭代向量并将元素添加到列表中.是否有任何简短的方法可以防止循环.或者可以是实现此功能的直接功能.
编辑:
例:
Vector f1() {} //f1 returns raw vector
Run Code Online (Sandbox Code Playgroud)
我想实现以下目标:
List<String> l = new ArrayList<String>();
Vector vec = f1();
for(Object obj: vec) {
l.add((String) obj);
}
Run Code Online (Sandbox Code Playgroud)
注意:我没有检查上面的代码是否编译.请将其视为伪代码
如果你100%确定Vector只包含字符串,最简单的方法是:
List<String> list = new ArrayList<>(vector);
Run Code Online (Sandbox Code Playgroud)
请注意,即使Vector包含其他类型的对象,这也将编译并运行正常.不过这个:
list.get(i);
Run Code Online (Sandbox Code Playgroud)
ClassCastException如果第i个元素不是String,则抛出一个.
由于你有一个原始Vector,你会收到警告.如果你想摆脱它们你可以使用:
@SuppressWarnings(value = {"unchecked", "rawtypes"})
public static List<String> rawVectorToList(Vector v) {
return new ArrayList<>(v);
}
Run Code Online (Sandbox Code Playgroud)
快速检测转换问题的另一种方法是手动复制数组(复制构造函数在引擎盖下执行的操作):
Vector v = ...;
String[] elements = Arrays.copyOf(v.toArray(), v.size(), String[].class);
List<String> list = Arrays.asList(elements);
Run Code Online (Sandbox Code Playgroud)
或者如果您需要列表是可变的:
List<String> list = new ArrayList<> (Arrays.asList(elements));
Run Code Online (Sandbox Code Playgroud)
这有利于在复制时检查类型.