Java 10 'var' 和继承

2024-01-02

经过审查后var所见特征here http://openjdk.java.net/jeps/286:

我在使用 JDK 10 设置 Eclipse/IntelliJ IDEA IDE 时遇到了困难,因此向拥有 Java 10 工作环境的 Stack Overflow 用户寻求帮助。

考虑以下:

public class A {
   public void someMethod() { ... }
}
public class B extends A{
   @Override
   public void someMethod() { ... }
}
...
...
...
var myA = new A(); // Works as expected
myA = new B(); // Expected to fail in compilation due to var being
               // syntactic sugar for declaring an A type
myA = (A) (new B()); // Should work
myA.someMethod(); // The question - which someMethod implementation is called?

使用时var,我希望 JVM 能够识别该变量所保存的派生类类型。并在执行 myA.someMethod() 时执行 B:someMethod() 而不是 A:someMethod()。

情况确实如此吗?


谢谢空指针 https://stackoverflow.com/users/1746118/nullpointer提供一个link https://tio.run/#java-jdk通过在线 Java 10 编译器,我得到了以下有趣的结果:

public class Main {
    static class A {
           public void someMethod() { System.out.println(this.getClass().getName()); }
    }
    static class B extends A{
           @Override
           public void someMethod() { System.out.println("Derived: " + this.getClass().getName()); }
    }
    public static void main(String[] args) {
        var myA = new A();
        myA.someMethod();
        myA = new B(); // does not fail to compile!
        myA.someMethod();
    }
}

和输出:

Main$A // As expected
Derived: Main$B  // As expected in inheritance

结论 - var 是语法糖:var myA = new A()相当于A myA = new A(),以及与之相关的所有 OOP。

PS:我试着用一个持有匿名类的 var 玩了一下,并想出了这个有趣的行为 - 感谢(再次)空指针 https://stackoverflow.com/users/1746118/nullpointer提及它作为重复项为什么我们不能将两个推断变量作为匿名类互相分配 https://stackoverflow.com/questions/49580431/why-cant-assign-2-inferred-var-as-anonymous-class-to-each-other:

static interface Inter {
    public void method();
}

public static void main(String[] args) {
    var inter = new Inter() {
        @Override
        public void method() {System.out.println("popo");}
    };
    inter.method();
    inter = new Inter() {
        @Override
        public void method() {System.out.println("koko");}
    };
    inter.method();
}

和输出:

Main.java:11: error: incompatible types: <anonymous Inter> cannot be converted to <anonymous Inter>
        inter = new Inter() {
                ^

由于第二个匿名类类型与第一个匿名类类型不同,对 var 的第二次赋值失败 - 强制执行 的语法糖角色var关键词。

令人惊讶的是,错误消息并没有更加精确 - 目前它没有什么意义,因为错误中显示的类型名称是相同的!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java 10 'var' 和继承 的相关文章

随机推荐

  • 使用 Docker、Selenium 和 Pytest 运行并行测试

    我正在尝试将这些所有东西结合起来在无头 Chrome 中运行并行测试 Docker 硒 Pytest 但是 我想知道运行系统的并行部分在哪里有意义 Docker 可以做到这一点 使用 selenium grid 这两个都可以用来运行并行 和
  • Android AsyncTask 和对象传递

    我需要一些有关登录过程的代码基本架构的帮助 我正在实施异步 Http 处理以使 ICS 正常工作 这段代码的目标是登录我的应用程序 从 UI 提交登录表单 Login java 连接到我们的服务器并通过 http 传递用户名 密码获取 XM
  • libopenssl-ruby 的作用是什么?

    在 Ubuntu 中使用 Ruby 时 我需要安装 libopenssl ruby 包 我想知道这个包的用途是什么 它是红宝石吗 它不是宝石 而是延伸 扩展可以打包为 gem 但这个不是 扩展是一个 C 库 可能与一些本机 ruby 代码混
  • Angular.js:输入日期显示日期-1天

    我有一个表格
  • R-Project:xlsx 包安装失败(由于 java 问题)

    我试图安装 xlsx 包 不幸的是 Java 有一个问题 我无法解决 请在下面找到尝试安装 xlsx 包时产生的输出 这是输出 R version 3 1 1 2014 07 10 Sock it to Me Copyright C 201
  • Maven 使用子 POM 中的子路径解析哪些 URL?

    我在某处读到 如果 Maven 项目使用继承 那么它的子项目将自动使用子项目的 URL 添加子路径artifactId 但现在我找不到参考资料了 Maven 将从父 POM 逐字继承哪些继承的 URL 并将为子 POM 添加子路径 例如 以
  • 如何比较 3 个文件(看看它们之间有什么共同点)?

    我想比较 3 个文件 看看文件中有多少信息是相同的 文件格式是这样的 Chr11 447 A C 74 DP 22 AF1 1 CI95 1 1 DP4 0 0 9 8 MQ 15 FQ 78 GT PL GQ 1 1 107 51 0 9
  • 如何在Java中内存映射(mmap)Linux块设备(例如/dev/sdb)?

    我可以使用 Java 读取 写入 Linux 块设备java nio 以下代码有效 Path fp FileSystems getDefault getPath dev sdb FileChannel fc null try fc File
  • 嵌套复杂 JSON 中的搜索键

    我必须通过 JavaScript 或 jQuery 在嵌套 JSON 中搜索键 在我的 JSON 对象中 所有键都是唯一的 我自己尝试了一些解决方案 但它们不起作用 这是我的代码 json app Garden Flowers Red fl
  • 过滤自己的日期字段,未使用有效和/或错误的日期格式

    当对我自己的日期字段进行过滤时 我没有获得预期的记录 而在通过解析默认日期字段进行过滤时 我确实获得了记录 下面的代码应该返回最后提供的 JSON 中的最后两条记录 请注意创建于是默认解析日期字段 而开始日期是我自己的日期字段 因此 在过滤
  • 我可以仅将 Python .pyc 文件部署到 Google App Engine 吗?

    我正在开发一个在 Google App Engine 上使用 Django 的项目 有人问我是否可以将某些代码仅部署为已编译的 所以我想问题是我可以上传一个仅包含相关代码片段的 pyc 文件吗 我已经在应用程序中使用views pyc 文件
  • 哪种类型特征表明该类型是 memcpy 可分配的? (元组、对)

    我想知道我可以执行什么类型自省来检测可通过简单的原始内存复制分配的类型 例如 据我了解 内置类型 内置类型的元组和此类元组的元组都属于此类 动机是如果可能的话我想传输原始字节 T t1 not necessarely default con
  • 创建 (ES6) 承诺而不开始解决它

    使用 ES6 Promise 如何在不定义解决逻辑的情况下创建 Promise 这是一个基本示例 一些 TypeScript var promises function waitFor key string Promise
  • Visual Studio 2013 中的“新建项目”对话框中缺少项目模板

    当我点击文件 gt 新建 gt 项目在 Visual Studio 2013 中 不存在任何项目模板 但是 在解决方案文件中 显然是在 Visual Studio 的另一个版本中创建的 当我尝试时 添加 gt 新项目 所有模板都在那里 我想
  • Swift 中的强引用和弱引用

    在 Objective C 中 您可以将属性定义为具有强引用或弱引用 如下所示 property strong property weak 这是如何快速完成的 直接从斯威夫特语言指南 https developer apple com li
  • MainActivity 关闭后停止服务(已编辑)

    我认为我根本不清楚 我确实希望该服务能够持续存在 即使主要活动通过用户操作被破坏或Android系统这样做 它做得很好 但是当应用程序在某个时刻重新打开时 我会想要检查如果背景活动存在并使用操作按钮停止它 请提前谢谢 我启动了后台服务 在我
  • 我需要做什么才能让 Hash.from_xml() 工作?

    我在代码中安装了 ActiveSupport 并需要 active support 但是当我尝试使用Hash from xml method 我缺少什么 gem list returns LOCAL GEMS activesupport 3
  • 如何从另一个变量名创建变量? [复制]

    这个问题在这里已经有答案了 好的 在 php 中我该怎么做 给定以下场景 array of letters var letters array a b c loop through array and create empty arrays
  • 在最接近的日期合并数据框

    我有一些实验的一些数据 按主题 ID 和日期索引 我想将数据连接在一起 但受试者可能在不同的日子进行实验 这是我的意思的一个例子 下图是两个不同实验的结果 SubjectID Date ScoreA 1 2016 09 20 10 1 20
  • Java 10 'var' 和继承

    经过审查后var所见特征here http openjdk java net jeps 286 我在使用 JDK 10 设置 Eclipse IntelliJ IDEA IDE 时遇到了困难 因此向拥有 Java 10 工作环境的 Stac