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;
}
Run Code Online (Sandbox Code Playgroud)
这两种方法有什么区别?一种方式比另一种方式更安全或更快还是无关紧要?
根据Java文档,泛型仅限于编译时.一旦代码编译,它们就会消失,这称为Type Erasure.
现在,关于方法,方法1只是向列表添加强制转换而不检查其中存在的所有元素的类型.这意味着,如果List被转换为Cat类型,那么在运行时代码中的任何地方都可能会出现意外的ClasscastException,而它的结果是Dog.
方法2创建一个全新的列表,它遍历所有元素并尝试将每个元素转换为目标类型.意思是,如果无法将所有元素强制转换为目标类型,则会失败.
我会说方法2是安全的,因为它确保在添加演员表之前一切正常(即本地化风险).方法1可能允许将List(包含Cat,Dog,Dinosaur)转换为List <Cat>,然后您可能会遇到意外故障.
这个例子很好地解释了它.
| 归档时间: |
|
| 查看次数: |
111 次 |
| 最近记录: |