当前位置: 首页 > 面试题库 >

Java为什么允许类型不安全的数组分配?

方河
2023-03-14
问题内容

通常,Java可被视为类型安全的语言。我知道泛型有一些缺陷,但是最近我遇到了一个从未有过的问题。分解:

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

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

ArrayList<Object> objs = new ArrayList<Integer>

如果我尝试诱使Java做一些事情

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

可以声明它,但只能添加type的对象null

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


问题答案:

我认为除了“传统设计”之外,没有其他答案。(我承认这是一种奇特的说法,因为“因为”。)您几乎 需要
能够以某种方式完成与您上一次作业相同的任务。(否则,假定使用Java 1.4之前的语言功能,那么您将不得不使用手动上下转换来制作大量副本)

在Java 1中,数组的类型语义基本上是固定不变的,泛型不可用,甚至很长一段时间都没有考虑。因此,没有可用的机制来表达使该构造类型安全所需的高阶类型约束-
Gosling(IIRC的简单爱好者)感到解决这种编译时类型安全的极端情况并不值得使该语言复杂化无论采用哪种解决方案。还是没有为在运行时进行检查以至于寻找解决方案而烦恼。(最终,语言设计决策至少在某种程度上是任意的,只有一个人可以肯定地回答这个问题。)



 类似资料:
  • 问题内容: 作为实验,我尝试扩展-array,如下所示: 在类本身中添加一些与排序,交换,子数组构建等有关的方法。但是我在编译时遇到了这个错误: 我很好奇:为什么Java不允许扩展数组? 问题答案: 扩展基本类型(例如a 或数组)会打开安全漏洞。如果Java允许您扩展数组,则采用数组的方法将变得不安全。这就是字符串为,而数组根本不能扩展的原因。 例如,您可以重写该方法,并返回不正确大小的数组。这有

  • 下面的泛型代码无法编译,我可以理解原因:这是为了阻止可能不兼容的类型添加到集合中: 然而,我可以对数组做同样的事情,并且不会得到编译器错误。当我运行它时,我会得到一个 为什么编译器不阻止我上传数组,因为它会麻烦地阻止我上传泛型?

  • 当重写超类的方法时,Java 允许返回类型是协变的。 为什么在覆盖方法时不允许相反的逆变参数类型?

  • 问题内容: Java中的数组的长度是固定的。Java为什么要允许大小为0的数组呢? 问题答案: 它表示它为空。即您可以遍历它,就好像它有项目并且没有结果发生一样: 从而避免了检查的需要。如果所讨论的数组为,则会发生异常,但是在这种情况下,它什么也不做,这可能是适当的。

  • 问题内容: 我从编译器收到的错误是“分配的左侧必须是变量”。我的用例是深度复制,但并没有实际意义。 在C ++中,可以分配给。 问题不在于如何规避对的分配。这很简单,但是决定不进行变量的背后是什么原理。 原因是技术上的还是概念上的? 到目前为止,我的猜测-用随机方法重建对象的可能性容易出错(概念上),但在技术上是可行的。 编辑 请避免使用“因为Java规范这么说”的变体。我想知道 这个决定 的 原

  • 问题内容: 我想理解为什么做出这个决定。通用异常有什么问题? (据我所知,泛型只是编译时的语法糖,Object无论如何它们都将转换为.class文件,因此有效地声明泛型类就好像其中的所有内容都是Object。。如果我错了,请更正我) 问题答案: 正如标记所说,类型是不可更改的,在以下情况下会出现问题: 两者和都被擦除为相同类型,JVM无法区分异常实例,因此也无法确定应执行哪个块。