转载

java – 未勾选的演员有什么问题?

我正在阅读J. Bloch的有效的Java,现在我在数组vs列表部分.这是他提供的未经检查的演员的例子:

interface Function<T> {
    T apply(T arg1, T arg2);
}

public class Main{
    public static void main( String[] args ){
        Function<String> f = null;
        List<String> str = Arrays.asList("asd");
        //staff
        reduce(str, f, ""); //E's deduced to String. Where is type-unsafe?
    }
    static <E> E reduce(List<E> list, Function<E> f, E initVal) {
        E[] snapshot = (E[]) list.toArray(); // Unchecked cast
        E result = initVal;
        for (E e : snapshot)
            result = f.apply(result, e);
        return result;  
    }
}

他表示该方法不是类型安全的,我们可以轻松获得ClassCastException.但我看不到怎么样类型不安全在哪里,类型变量E将始终被推导到适当的类型,所以我们不用担心class-cast-exeption.

不能给出一个抛出ClassCastException的例子?

没有编译时保证list.toArray()将返回E []类型的数组.而且它几乎总是返回一个Object []类型的数组.因此,根据这个数组的使用情况,你可能会有一个ClassCastException.例如,考虑以下代码:

public static void main( String[] args ){
    List<String> str = Collections.singletonList("asd");
    String[] array = test(str);
}

static <E> E[] test(List<E> list) {
    E[] snapshot = (E[]) list.toArray(); // Unchecked cast
    return snapshot;
}

这里返回这个E []数组,接收器期望返回String []数组.但实际上它是Object []数组,所以在将返回的泛型类型隐式转换为String []之后,您将得到main方法中的ClassCastException.

在您的代码中,您可以确保数组以安全的方式使用.但编译器不够聪明,不能进行分析,所以只是警告你.

代码日志版权声明:

翻译自:http://stackoverflow.com/questions/31156721/whats-wrong-with-the-unchecked-cast

原文  https://codeday.me/bug/20181016/287710.html
正文到此结束
Loading...