gpt4 book ai didi

java - 未经检查的 Actor 有什么问题?

转载 作者:太空狗 更新时间:2023-10-29 22:52:58 25 4
gpt4 key购买 nike

我正在阅读 J. Bloch 的 effective Java,现在我正在阅读数组与列表部分。这是他提供的未经检查的转换示例:

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 将始终被推导为适当的类型,因此我们不必担心类强制转换。

你不能给出一个抛出 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[] 数组,因此在将返回的泛型类型隐式转换为 后,您将在 main 方法中得到 ClassCastException >字符串[]

在您的代码中,您可以确保以安全的方式使用该数组。但是编译器不够智能,无法进行这种分析,所以它只是警告你。

关于java - 未经检查的 Actor 有什么问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31156721/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com