java - 将 List 类型转换为 List<T> 的两种方法之间的区别

标签 java java-8

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/

相关文章:

java - jProfiler 不提供方法级别的统计信息

java - 流内部如何处理数据?

空列表上的 Java 8 流操作

java - scheduler的standby()和pauseAll()有什么区别?

java - BigDecimal 汇总统计

Java 8 Comparator nullsFirst naturalOrder 混淆

datetime - 如何指定日期/时间偏移(以天为单位)

java - 为什么 Maven swagger 插件不扫描外部模块?

java - PKIX 路径构建失败 : wso2 oauth

java - 无法使用 Java 删除 Azure 上的文件