当前位置: 首页 > 知识库问答 >
问题:

使用本地类型推断的程序在较低的Java版本上能工作吗?[副本]

孟成文
2023-03-14

Java 10引入了本地类型推断,这真的很酷:

var list = new ArrayList<String>(); // Compiles fine

然而,人们似乎不愿意在发布新版本的那天(周、月、年)更新他们的Java版本。

这意味着,如果要支持大多数使用旧Java版本的用户,我需要等到Java8的EOL之后才能使用list.of(1,2,3)

有人试过这个吗?使用类型推断的程序是否在较旧的Java版本上运行?

感谢您的投入。

共有1个答案

元修然
2023-03-14

类型推断不会更改字节码,因此原则上,使用var编译的代码将与较旧的JVM兼容。
但是,像往常一样,javac不允许您将-source选项与比-target选项更高的发行版本组合在一起。

因此,在源代码中使用var运行较旧版本的唯一方法是为Java ;10编译它,然后将编译好的类下载到较早的版本。最简单的方法就是更改类文件版本。我刚刚验证了一个使用var的简单测试用例在递减类版本号后在Java ;9上工作。但是,当然,一个更复杂的下载工具应该验证没有其他代码特性或更新平台特性的API引用。

也许,一个替代的编译器会出现,允许灵活地使用较新的源版本和较旧的目标版本。正如开头所说的,javac从来没有这样做过。

 类似资料:
  • 从JEP 286中,我们可以在JDK 10(18.3)中利用本地类型推断()。JEP声明将进行以下编译,这是预期的: 谢谢!

  • 这可能是一个愚蠢的问题,但我会遇到任何问题运行Java程序和相关的库编译Java版本1.6和1.7(我编译使用1.7而一些库编译使用1.6)和运行整个程序在1.7的JRE里?

  • 问题内容: 我尝试扫描有关本地类型推断的JEP-286。我看到这仅适用于局部变量- 了解。因此这确实有效: 我确实看到,另一方面,它无法编译: 很明显,事实并非如此,因为JEP是这样说的。现在我的问题是: 对于宣布失败的 公共/受保护 成员,至少是IMO,这是完全合理的。但是,为什么即使编译也不编译呢?我只能假设您仍然可以通过反射保留该变量(而我无法获得这样的局部字段)…而且获取该变量可能需要强制

  • 问题内容: 这可能是一个愚蠢的问题,但是在运行以Java 1.6 和 1.7 版编译的Java程序和相关库(我使用1.7进行编译,而某些库是使用1.6进行编译)并在1.7 JRE中运行整个程序时,我会遇到任何问题? 问题答案: 您不会遇到任何问题-这就是Java的魔力-它是向后兼容的。您几乎可以在Java 8上运行Java 1中的所有代码。没有理由不能在Java 8 Runtime上运行Java

  • 我已经很久没有使用Heroku了,所以我有点生疏了。我创建了一个运行Ratchet IOServer的小型PHP应用程序。它监听端口5000。如果我运行并使用连接,一切似乎都能正常工作。我尝试了几种让PHP进程运行并接受连接的方法。 我的Procfile如下所示; 正在运行 然后,当我将服务器部署到Heroku时,它就不工作了。当我尝试telnet到端口上的框时,我得到 我刚刚读了关于Heroku

  • 问题内容: 我们的构建服务器运行Jenkins 1.502,并将Subversion插件升级到1.45版。此插件使用。 另外,我们还安装了SVN客户端1.7.8。 Jenkins已成功从SVN信息库检出源代码。但是当我进入工作区目录并尝试手动运行一些svn命令时,它失败了: 错误消息表明工作副本是由SVN 1.4创建的,但是svnkit的版本是1.7.6。怎么会这样? 我搜索了整个文件系统,没有其