【问题标题】:Why Java does not allow to extend array type为什么Java不允许扩展数组类型
【发布时间】:2014-09-14 19:43:49
【问题描述】:

作为一个实验,我尝试像这样扩展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 不允许扩展数组?

【问题讨论】:

  • 对于程序员 SE 来说可能是一个更好的问题。另请参阅我的问题here
  • 因为它是一个原语而不是一个类。您可以改为从 ArrayList 扩展,但您将拥有 List
  • @Eran 我不这么认为,正如那个问题所问的那样:java 是否允许这样做。而我的问题是:为什么 Java 不允许这样做?

标签: java arrays inheritance syntax


【解决方案1】:

数组是对象,但数组类型不是类,因此不能扩展。参见例如JLS #10.8

【讨论】:

    【解决方案2】:

    扩展String 或数组等基本类型会打开安全漏洞。如果 Java 允许您扩展一个数组,那么它采用数组的方法将变得不安全。这就是为什么字符串是final,而数组根本无法扩展的原因。

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

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

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

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

    【讨论】:

    • 我认为它允许某人覆盖clone() 方法的论点可能是无效的。如果超类的方法被声明为 final,那么它就不能在派生类中被覆盖。
    • 我明白他为什么要这样做。我想将 Linq 样式的代码添加到 Java 中。你不能声明一个数组Thing[] list = new Thing[100];,使用数组语法'Thing thisThing = list[50];'访问元素并且还使用扩展方法:'Thing[] subset = list.Where(new Comparator,,, )。而且你也不能重写 [] 运算符来简化代码。
    猜你喜欢
    • 2010-11-01
    • 1970-01-01
    • 2021-10-15
    • 2010-10-04
    • 2020-11-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多