问题标签 [jls]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - JVM如何初始化超类和子类中的字段?
任何人都可以说出为什么以下代码的输出为“null”吗?构造复杂对象并将细节委托给其子类的最佳方法是什么?
java - 通用方法调用
我对理解这种通用方法调用有疑问:
以下是上述情况的背景:
问题是在调用<T>
之前扮演什么角色?getObject(objectName)
java - 什么是类的参数化调用
JLS 在第 9.6.1 节 ( http://docs.oracle.com/javase/specs/jls/se7/html/jls-9.html#jls-9.6.1 ) 中说如下。
“如果在注释类型中声明的方法的返回类型不是以下之一,则这是编译时错误:原始类型、字符串、类、对 Class 的任何参数化调用、枚举类型(第 8.9 节)、注释类型,或元素类型是上述类型之一的数组类型(第 10 节)。”
什么是“类的任何参数化调用”?有什么例子吗?
java - 为什么在 Enum hashCode() 中引用 Object hashCode() 实现,而不是 ordinal() 函数?
我一直认为enum hashCode是指Java 中的ordinal,因为ordinal似乎是hashCode的完美候选者,但事实证明enum hashCode实际上是指默认的hashCode 对象实现。
我理解,这与JLS并不矛盾,但这仍然让我感到惊讶,我想不出为什么会这样。尽管我猜想JVM可能会以某种方式依靠它来提供唯一的保证,但这对于 64 位JVM不再适用。
我已经检查了 JDK 1.6 和最新的 JDK 7,这两种方法都是一样的。
有人知道为什么,它是这样制作的吗?
将ordinal用作hashCode非常有意义,因为它满足所有所需的凭据,而且它甚至从一个 JVM 开始到另一个 JVM 都是一致的,这不是必需的,但拥有它是件好事。
java - 限定名称和字段访问表达式有什么区别?
令 C 为声明受保护成员的类。只有在 C 的子类 S 的主体内才允许访问。
此外,如果 Id 表示实例字段或实例方法,则:
如果通过限定名称 Q.Id 进行访问,其中 Q 是 ExpressionName,则当且仅当表达式 Q 的类型是 S 或 S 的子类时才允许访问。
如果通过字段访问表达式 E.Id(其中 E 是 Primary 表达式)或通过方法调用表达式 E.Id(. . .)(其中 E 是 Primary 表达式)进行访问,则当且仅如果 E 的类型是 S 或 S 的子类。
限定名称和字段访问表达式有什么区别?
java - 为什么接口根据类文件格式扩展Object?
为什么 JVM 规范声明接口必须有一个super_class
of java/lang/Object
,即使接口不扩展java/lang/Object
?
我特别指的是 JVM 规范的§4.1,它说:
对于接口,super_class 项的值必须始终是 constant_pool 表的有效索引。该索引处的 constant_pool 条目必须是表示类 Object 的 CONSTANT_Class_info 结构。
然而在JLS的 §9.2 中,它说接口不扩展 Object。而是声明了一个隐式创建的抽象方法,它匹配 Object 类中的每个公共方法:
如果接口没有直接的超接口,则接口隐式声明一个公共抽象成员方法 m,其签名为 s,返回类型为 r,并且 throws 子句 t 对应于每个签名为 s、返回类型为 r 和 throws 子句的公共实例方法 m在 Object 中声明,除非接口显式声明了具有相同签名、相同返回类型和兼容 throws 子句的方法。
java - 为什么 JLS 声明最大的 int 文字是 2147483648?
JLS 3.10.1. Integer Literals
http://docs.oracle.com/javase/specs/jls/se7/html/jls-3.html#jls-3.10.1状态
同时这条线
产生编译错误
JLS错了吗?
java - Java 语言规范中是否有过“重大变化”?
除了引入 'assert' 关键字这一可能广为人知的例外,Java 语言规范中是否曾经发生过变化,导致旧代码不再与 JDK 的新源级别兼容?
到目前为止的总结(非常感谢您的评论):
在升级到更高版本时,如果代码使用在更高版本的 Java 语言规范 (JLS) 中引入的关键字之一进行声明,“旧”Java 代码可能会导致编译错误:
- 断言
- 枚举
- 严格的fp
java - 如果操作数的类型较小,JLS 在哪里指定加法的结果是 int?
关于为什么我得到类型不匹配:无法从 int 转换为 byte,我尝试在 JLS 中快速搜索以查找它提到的byte
操作数之间相加的结果自动扩大到的位置int
。
我找到的最好的是本教程,但我在 JLS 中没有找到任何东西。
转换一章没有提到任何关于加法运算符的内容,至少我找不到任何东西。Additive Operators 段落没有提到字节的自动加宽。它提到了这一点 the type of each of the operands of the binary - operator must be a type that is convertible (§5.1.8) to a primitive numeric type
,但没有关于扩大。byte 是数字数据类型。
我错过了什么?