草庐IT

java - 从 JVM 的角度来看,从原始数组继承是不可能的吗?

coder 2024-03-16 原文

我的疑问是这个:

在 Java 中,不允许从数组继承,即不能做这样的事情:

class FloatVec extends float[]
{
    // Vector methods.
}

FloatVec somevec = new FloatVec()[] { 1, 2, 3 }; // With array initializer.

或者更好:

class FloatVec3 extends float[3]
{
    // Regular accessor.
    public float getX() {
        return this[0];
    }
    // Or say, make it the 'this' implicit like with other fields:
    public void setVec(float x, float y, float z) {
        [0] = x;
        [1] = y;
        [2] = z;
    }
    // And specific vec3 methods like:
    public float dotProduct() {
        float x = this[0];
        float y = this[1];
        float z = this[2];
        return x * x + y * y + z * z;
    }
}

但是数组实际上实现了特定的接口(interface),被认为是对象。即,人们期望数组实例具有 Object 公开的相同方法,加上一个特定的数组字段,即最终的“长度”字段。

所以我的问题是,即使 Java 语言不允许这种用法:

  • 如果不做太多改动,是否可以在JVM中实现?

  • JVM 是否将数组视为具有可继承类的任何对象?

  • JVM 是否像对待枚举一样对待数组,即让数组对象自动从定义的数组类继承?

  • 数组类是否以可以从中继承的方式定义?

最佳答案

Could it be implemented in the JVM without too many changes?

没有。变化将是巨大的。它们会影响整个 Java 工具链,以及在 JLS/JVM 抽象层或以下工作的大量第 3 方代码。

没有什么能阻止您下载 (OpenJDK) 源代码并尝试自己做一个实验。但在真正的 Java 中发生这种情况的可能性(IMO)微乎其微。

我在底部列出了 一些 技术问题。我敢肯定还有其他人。

Does the JVM treats arrays like any object with a class that can be inherited from?

没有。

Java 中的数组类型提供了少量的方法。 (方法有getClasshashCodetoStringclonewaitnotifynotifyAll ... 根据 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 编译器不知道该怎么做它...即使您以某种方式设法让调用通过了类加载器和 validator 。

一旦你解决了这个问题,就会出现这样的问题,即如果可以使用用户定义的父类(super class)声明数组,那么这些父类(super class)将(大概)能够拥有实例变量。但这意味着 JVM 规范需要更改,以便:

  • 数组的堆节点可以保存实例变量以及数组本身,

  • 常规字段加载和存储指令适用于数组对象以及 reculare 对象,

  • 等等。

如您所见,这个“小扩展”揭示了 JVM 中的许多其他设计决策。

关于java - 从 JVM 的角度来看,从原始数组继承是不可能的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26822618/

有关java - 从 JVM 的角度来看,从原始数组继承是不可能的吗?的更多相关文章

  1. ruby-on-rails - 在 Ruby 中循环遍历多个数组 - 2

    我有多个ActiveRecord子类Item的实例数组,我需要根据最早的事件循环打印。在这种情况下,我需要打印付款和维护日期,如下所示:ItemAmaintenancerequiredin5daysItemBpaymentrequiredin6daysItemApaymentrequiredin7daysItemBmaintenancerequiredin8days我目前有两个查询,用于查找maintenance和payment项目(非排他性查询),并输出如下内容:paymentrequiredin...maintenancerequiredin...有什么方法可以改善上述(丑陋的)代

  2. ruby - 如何以所有可能的方式将字符串拆分为长度最多为 3 的连续子字符串? - 2

    我试图获取一个长度在1到10之间的字符串,并输出将字符串分解为大小为1、2或3的连续子字符串的所有可能方式。例如:输入:123456将整数分割成单个字符,然后继续查找组合。该代码将返回以下所有数组。[1,2,3,4,5,6][12,3,4,5,6][1,23,4,5,6][1,2,34,5,6][1,2,3,45,6][1,2,3,4,56][12,34,5,6][12,3,45,6][12,3,4,56][1,23,45,6][1,2,34,56][1,23,4,56][12,34,56][123,4,5,6][1,234,5,6][1,2,345,6][1,2,3,456][123

  3. ruby - 多次弹出/移动 ruby​​ 数组 - 2

    我的代码目前看起来像这样numbers=[1,2,3,4,5]defpop_threepop=[]3.times{pop有没有办法在一行中完成pop_three方法中的内容?我基本上想做类似numbers.slice(0,3)的事情,但要删除切片中的数组项。嗯...嗯,我想我刚刚意识到我可以试试slice! 最佳答案 是numbers.pop(3)或者numbers.shift(3)如果你想要另一边。 关于ruby-多次弹出/移动ruby​​数组,我们在StackOverflow上找到一

  4. ruby - 将数组的内容转换为 int - 2

    我需要读入一个包含数字列表的文件。此代码读取文件并将其放入二维数组中。现在我需要获取数组中所有数字的平均值,但我需要将数组的内容更改为int。有什么想法可以将to_i方法放在哪里吗?ClassTerraindefinitializefile_name@input=IO.readlines(file_name)#readinfile@size=@input[0].to_i@land=[@size]x=1whilex 最佳答案 只需将数组映射为整数:@land边注如果你想得到一条线的平均值,你可以这样做:values=@input[x]

  5. ruby - 通过 erb 模板输出 ruby​​ 数组 - 2

    我正在使用puppet为ruby​​程序提供一组常量。我需要提供一组主机名,我的程序将对其进行迭代。在我之前使用的bash脚本中,我只是将它作为一个puppet变量hosts=>"host1,host2"我将其提供给bash脚本作为HOSTS=显然这对ruby​​不太适用——我需要它的格式hosts=["host1","host2"]自从phosts和putsmy_array.inspect提供输出["host1","host2"]我希望使用其中之一。不幸的是,我终其一生都无法弄清楚如何让它发挥作用。我尝试了以下各项:我发现某处他们指出我需要在函数调用前放置“function_”……这

  6. ruby - 检查数组是否在增加 - 2

    这个问题在这里已经有了答案:Checktoseeifanarrayisalreadysorted?(8个答案)关闭9年前。我只是想知道是否有办法检查数组是否在增加?这是我的解决方案,但我正在寻找更漂亮的方法:n=-1@arr.flatten.each{|e|returnfalseife

  7. java - 等价于 Java 中的 Ruby Hash - 2

    我真的很习惯使用Ruby编写以下代码:my_hash={}my_hash['test']=1Java中对应的数据结构是什么? 最佳答案 HashMapmap=newHashMap();map.put("test",1);我假设? 关于java-等价于Java中的RubyHash,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/22737685/

  8. ruby - 如果指定键的值在数组中相同,如何合并哈希 - 2

    我有一个这样的哈希数组:[{:foo=>2,:date=>Sat,01Sep2014},{:foo2=>2,:date=>Sat,02Sep2014},{:foo3=>3,:date=>Sat,01Sep2014},{:foo4=>4,:date=>Sat,03Sep2014},{:foo5=>5,:date=>Sat,02Sep2014}]如果:date相同,我想合并哈希值。我对上面数组的期望是:[{:foo=>2,:foo3=>3,:date=>Sat,01Sep2014},{:foo2=>2,:foo5=>5:date=>Sat,02Sep2014},{:foo4=>4,:dat

  9. ruby - 在 Ruby 中用键盘诅咒数组浏览 - 2

    我正在尝试在Ruby中制作一个cli应用程序,它接受一个给定的数组,然后将其显示为一个列表,我可以使用箭头键浏览它。我觉得我已经在Ruby中看到一个库已经这样做了,但我记不起它的名字了。我正在尝试对soundcloud2000中的代码进行逆向工程做类似的事情,但他的代码与SoundcloudAPI的使用紧密耦合。我知道cursesgem,我正在考虑更抽象的东西。广告有没有人见过可以做到这一点的库或一些概念证明的Ruby代码可以做到这一点? 最佳答案 我不知道这是否是您正在寻找的,但也许您可以使用我的想法。由于我没有关于您要完成的工作

  10. ruby - 如何在 Grape 中定义哈希数组? - 2

    我使用Ember作为我的前端和GrapeAPI来为我的API提供服务。前端发送类似:{"service"=>{"name"=>"Name","duration"=>"30","user"=>nil,"organization"=>"org","category"=>nil,"description"=>"description","disabled"=>true,"color"=>nil,"availabilities"=>[{"day"=>"Saturday","enabled"=>false,"timeSlots"=>[{"startAt"=>"09:00AM","endAt"=>

随机推荐