Could it be implemented in the JVM without too many changes?
不,这些变化将是巨大的.它们会影响整个Java工具链,也会影响JLS / JVM抽象层或其下方的大量第三方代码.
没有什么可以阻止您下载(OpenJDK)源代码并尝试自己做这个实验.但真正Java中发生这种情况的可能性很小(IMO).
我在最底层列出了一些技术问题.我确信还有其他人.
Does the JVM treats arrays like any object with a class that can be inherited from?
没有.
Java中的数组类型提供了少量方法. (方法是getClass,hashCode,toString,clone,wait,notify和notifyAll …根据Object API.)
据我所知,这些方法的实际实现是由java.lang.Object定义的本机方法提供的.但由于JLS不允许您编写从数组继承的代码,因此JVM规范不需要提供实现此类代码的方法.而且,在实践中,它没有.
Does the JVM treats arrays like enums, ie, making the array objects inherit automatically from a defined array class?
否.数组类型隐式继承自java.lang.Object.
Is the array class defined somewhere in such a way that it could be inherited from?
没有这样的类.数组类型隐式继承自Object.
在JVM规范级别,使阵列更像“类似”有几个主要障碍:
>数组类型(“[elem-type”)的“类型字符串”表示仅提及该元素.实际的数组类型没有名称,如果是,那么“Lname;”表示这是一个常规类,而不是数组类型.
>数组由特殊的JVM指令创建,这些指令将元素类型提供为操作数而不是数组类型.
除此之外,JVM实现将假设数组如何工作以便有效地实现它们.即使(根据JLS)理论上似乎可以使用invoke指令来调用数组上的非标准方法,JVM解释器或JIT编译器也不知道该怎么做…即使你不知何故设法通过类加载器和验证器潜行调用.
一旦你越过那个,那么就存在这样的问题,即如果数组可以用用户定义的超类声明,那么那些超类(可能)将能够拥有实例变量.但这意味着JVM规范需要改变,以便:
>数组的堆节点可以包含实例变量以及数组本身,
>常规字段加载和存储指令适用于数组对象以及reculare对象,
>依此类推.
正如您所看到的,这个“小扩展”在JVM中揭示了许多其他设计决策.