public static <T> List<T> templatizeList(final List list, final Class<T> clazz) {
return (List<T>) list;
}
public static <T> List<T> typeSafeAdd(List<?> from, Class<T> clazz) {
List<T> to = new ArrayList<>();
from.forEach(item -> to.add(clazz.cast(item)));
return to;
}
这两种方法有什么区别?一种方法比另一种方法更安全或更快还是无关紧要?
最佳答案
根据 Java 文档,泛型仅限于编译时间。一旦代码编译,它们就会消失,这称为 Type Erasure .
现在,关于方法,方法 1 只是将强制转换添加到列表中,而不检查其中存在的所有元素的类型。这意味着,如果 List 被转换为 Cat 类型并且从中得到的是 Dog,那么在运行时,您可能会在代码中的任何位置遇到意外的 ClasscastException。
方法 2 创建一个全新的列表,它迭代所有元素并尝试将每个元素转换为目标类型。这意味着,如果无法将所有元素转换为目标类型,则会失败。
我想说方法 2 是安全的,因为它可以确保在添加强制转换之前一切正常(即本地化风险)。方法 1 可能允许将 List(包含 Cat、Dog、Dinosaur)强制转换为 List< Cat >,然后,您可能会遇到意外的失败。
This example解释得很好。
关于java - 将 List 类型转换为 List<T> 的两种方法之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34092924/