2014-07-23 232 views
5

延长数组类型作为一个实验,我试图扩大的int - 阵列是这样的:为什么Java不允许以

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不允许扩展数组?

+0

对于程序员SE来说可能是一个更好的问题。另请参阅我的问题[here](http://programmers.stackexchange.com/a/239194/87528)。 – Azar

+1

[Java:Extend class as array](http://stackoverflow.com/questions/10914928/java-extend-class-as-array) – Eran

+0

可能存在重复,因为它是原始类而不是类。你可以从ArrayList扩展来代替,但是你会有列表 –

回答

9

扩展基本类型,如String或阵列会打开安全漏洞。如果Java让你扩展一个数组,那么使用数组的方法将变得不安全。这就是为什么字符串是final,并且阵列根本无法扩展。

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

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

有两种解决方案,你正在试图解决的问题:

  • 你可以把逻辑放到一个辅助类的静态方法,类似于Collections等,或
  • 您可以封装您的IntArrayExtension类中的数组,并提供用于访问数组及其附加功能的包装方法。
+0

我认为它允许某人重写clone()方法的说法可能无效。如果一个超类的方法被声明为final,那么它就不能在派生类中超集。 – Mitselplik

+0

我明白他为什么要这样做。我想这样做将Linq样式的代码添加到Java中。你不能声明一个数组'Thing [] list = new Thing [100];',使用数组语法访问元素'Thing thisThing = list [50];'并且使用扩展方法:'Thing [] subset = list.Where(新比较器 ,,,)。你也不能重写[]运算符来简化代码。 – Mitselplik

4

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

+0

+1指向正式文档。 –

相关问题