两种类型的方式之间的区别铸造List to List <T>

wou*_*non 0 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;
    }
Run Code Online (Sandbox Code Playgroud)

这两种方法有什么区别?一种方式比另一种方式更安全或更快还是无关紧要?

Dar*_*hta 6

根据Java文档,泛型仅限于编译时.一旦代码编译,它们就会消失,这称为Type Erasure.

现在,关于方法,方法1只是向列表添加强制转换而不检查其中存在的所有元素的类型.这意味着,如果List被转换为Cat类型,那么在运行时代码中的任何地方都可能会出现意外的ClasscastException,而它的结果是Dog.

方法2创建一个全新的列表,它遍历所有元素并尝试将每个元素转换为目标类型.意思是,如果无法将所有元素强制转换为目标类型,则会失败.

我会说方法2是安全的,因为它确保在添加演员表之前一切正常(即本地化风险).方法1可能允许将List(包含Cat,Dog,Dinosaur)转换为List <Cat>,然后您可能会遇到意外故障.

这个例子很好地解释了它.

  • 比有保证的要强一点.方法2不安全,但确实将风险本地化.我想,那就像它一样好. (3认同)