gpt4 book ai didi

java - 为什么 Java 允许类型不安全的数组赋值?

转载 作者:太空狗 更新时间:2023-10-29 22:53:02 26 4
gpt4 key购买 nike

一般来说,Java可以被认为是一种类型安全的语言。我知道泛型存在一些缺陷,但我最近遇到了一个以前从未遇到过的问题。分解:

Object[] objects = new Integer[10];
objects[0] = "Hello World";

不会像预期的那样导致编译时错误。我会假设 Object 数组的声明将不允许指向其他数组。在泛型中,我不允许做这样奇怪的事情:

ArrayList<Object> objs = new ArrayList<Integer>

如果我试图欺骗 Java 来做一些事情

ArrayList<? extends Object> objects = new ArrayList<Integer>

我可以声明它,但我只能添加 null 类型的对象。

为什么 Java 不阻止声明这种奇怪的数组?

最佳答案

首先,我应该指出这是类型安全的。

Object[] objects = new Integer[10];
objects[0] = "Hello World";

因为会抛出异常。 (它不是静态类型安全的……但那是完全不同的说法。)

Java 允许这样做的原因是历史性的。在 Java 5 之前,Java 不支持任何形式的泛型。 Gosling 曾说过,如果他们有时间弄清楚泛型并将其合并到 Java 1.0 中,他们就会这么做。

不幸的是,他们没有。但他们仍然希望能够编写具有以下签名的通用排序方法之类的东西:

    void sort(Object[] array, Comparator comp) ...

为了使这个方法适用于任何类型的对象数组(没有泛型),有必要使数组协变;即,使传递 String[]Integer[] 作为正式类型为 Object[] 的参数合法。如果他们没有这样做,您将不得不将 String[] 复制到 Object[],对其进行排序,然后再将其复制回来。

关于java - 为什么 Java 允许类型不安全的数组赋值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13685158/

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