我偶然发现了以下内容(http://docs.oracle.com/javase/8/docs/technotes/guides/language/assert.html#compatibility):
除非您使用 -source 1.4 特别请求源模式1.4 flag,编译器在源模式1.3下运行。 如果你忘了使用 这个标志,使用新断言语句的程序不会 编译。让编译器使用旧语义作为其默认值 行为(即允许断言用作标识符)是 完成最大的源兼容性。源模式1.3可能是 随着时间的推移逐步淘汰。
请注意,这是来自Java 8的官方Oracle文档---但我之前从未遇到过这个特定的编译时错误。更重要的是,
class Test{
public static void main(String[] args){
int a = 0;
assert a < 0: "a is not negative!";
}
}
不仅在Java 8下编译,而且在没有标记的情况下编译。调用
javac Test.class
JDK 1.6.0_24(我最老的;〜2011年3月)。
显然,作为新关键字转换为assert
已经结束了。
所以这些是我的问题:具体是什么时候发生的?为什么在地球上Oracle不断添加这个警告(&#34;如果你忘了使用这个标志,程序不会编译&#34 ;;看起来,它的斜体,甚至!)到每个文档新版本?
这不仅仅是空闲的好奇心,让我感到奇怪的是什么时候&#39;为什么&#39;在四天之内我将为Java 8(1Z0-809)编写我的OCP考试,我希望各种各样的恶作剧从黑暗角落向我跳跃...... / p>
答案 0 :(得分:1)
这个官方Java指南:http://docs.oracle.com/javase/8/docs/technotes/guides/language/assert.html#compatibility是为Java 1.4版本编写的,它引入了以前没有的断言声明(在1.3版本中)。
实际上,本指南来自此页面,它引用了每个已发布Java版本的一些增强功能: http://docs.oracle.com/javase/8/docs/technotes/guides/language/enhancements.html
它来自这个特定的部分:
J2SE 1.4中的增强功能
Assertion Facility - 断言是布尔表达式 程序员认为对于计算机的状态是真实的 程序。例如,在对列表进行排序之后,程序员可能会 断言列表按升序排列。评估断言 运行时确认它们的有效性是最强大的工具之一 提高代码质量,因为它很快就会发现程序员的代码 关于程序行为的误解。
所以,实际上并不是没有更新文档的问题
您必须将此信息视为指定版本的指南:J2SE 1.4
拥有这种历史记录对于通过版本概述Java语言的演变非常有用。
但是您的测试是准确的,您还可以从每个版本更新的javac
官方文档进行验证,javac
JDK 8默认情况下不使用1.3源代码。
编译类时,javac
命令可以将source
作为参数,指定源代码中要接受的主要JDK版本。
From the official Java 8 documentation:
-source release
指定接受的源代码版本。以下值 允许发布:
1.3编译器不支持在Java SE 1.3之后引入的断言,泛型或其他语言功能。
1.4编译器接受包含断言的代码,这些代码是在Java SE 1.4中引入的。
1.5编译器接受包含Java SE 5中引入的泛型和其他语言特性的代码。
5 1.5的同义词。
1.6 Java SE 6中没有引入语言更改。但是,源文件中的编码错误现在报告为错误而不是 警告与早期版本的Java平台标准版一样。
6 1.6的同义词。
1.7编译器接受具有Java SE 7中引入的功能的代码。
7同义词1.7。
1.8这是默认值。编译器接受具有Java SE 8中引入的功能的代码。
8 1.8的同义词。
如果未指定此参数,则它具有默认值
您可以读到1.8
是默认值。
因此,编译器接受具有Java SE 8
中引入的功能的源代码(当然包括1.4中的assert
)。