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

为什么Java不允许扩展数组类型

公孙和怡
2023-03-14
问题内容

作为实验,我尝试扩展int-array,如下所示:

public class IntArrayExtension extends int[]{
 // additional fields and methods.
}

在类本身中添加一些与排序,交换,子数组构建等有关的方法。但是我在编译时遇到了这个错误:

IntArrayExtension.java:1: unexpected type
found   : int[]
required: class
public class IntArrayExtension extends int[]{
                                          ^
1 error

我很好奇:为什么Java不允许扩展数组?


问题答案:

扩展基本类型(例如a
String或数组)会打开安全漏洞。如果Java允许您扩展数组,则采用数组的方法将变得不安全。这就是字符串为final,而数组根本不能扩展的原因。

例如,您可以重写该clone()方法,并返回不正确大小的数组。这有可能破坏以数组为参数的系统代码的逻辑。

最重要的是,数组是Java中的特殊对象,因为它们没有类定义。

您尝试解决的问题有两种解决方案:

  • 您可以使用类似于的静态方法将逻辑放入帮助器类中Collections,或
  • 您可以将数组封装在IntArrayExtension类中,并提供用于访问该数组及其附加功能的包装方法。


 类似资料:
  • 问题内容: 我想知道Java中是否有特殊原因总是使用“ ”而不是“ ”来定义类型参数的界限。 例: 被禁止但是 是正确的。是什么原因呢? 问题答案: 在类“实现”还是“扩展”之间,通用约束语言没有语义差异。约束可能性是“扩展”和“超级”-也就是说,该类是可分配给其他类的对象(扩展),还是该类可从该类分配(超级)。

  • 问题内容: 通常,Java可被视为类型安全的语言。我知道泛型有一些缺陷,但是最近我遇到了一个从未有过的问题。分解: 不会导致预期的编译时错误。我假设Array的声明将不允许指向其他数组。在泛型中,我不允许做类似以下这样的怪异的事情: 如果我尝试诱使Java做一些事情 可以声明它,但只能添加type的对象。 Java为什么不阻止声明这种奇怪的数组? 问题答案: 我认为除了“传统设计”之外,没有其他答

  • 问题内容: 创建数组时,无法更改其大小;它是固定的。好的,看起来不错,我们可以创建一个新的更大的数组并逐个复制值,这有点慢。它的技术背景是什么? 问题答案: 这个问题没有提到语言,因此我将选择基于“ C”的数组作为答案。 数组被分配为单个内存块。增长数组是有问题的,因为正确执行此操作的唯一方法是在最后增长它。为了增加大小N,在数组的末尾必须在下一个分配的地址之前至少有N个空闲字节。 要支持这种类型

  • Java说: 所以说数组是协变的。但对于泛型,他们说: 因此它是不变量。但问题是,“泛型真的不变吗?”? 例如,如果我给出: 这意味着列表可以采用异常的子类型,例如这是有效的: 那么为什么泛型被称为不变量呢?

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

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