问题标签 [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.

0 投票
2 回答
115 浏览

java - JVM如何初始化超类和子类中的字段?

任何人都可以说出为什么以下代码的输出为“null”吗?构造复杂对象并将细节委托给其子类的最佳方法是什么?

0 投票
5 回答
878 浏览

java - 通用方法调用

我对理解这种通用方法调用有疑问:

以下是上述情况的背景:

问题是在调用<T>之前扮演什么角色?getObject(objectName)

0 投票
1 回答
136 浏览

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 节)。”

什么是“类的任何参数化调用”?有什么例子吗?

0 投票
2 回答
285 浏览

java - java语法中具有多个类型参数列表的构造函数

Java 语言规范 v7 中的java 语法为构造函数指定了以下语法规则:

这里让我困惑的是CreatedName规则。因此,诸如

将是有效的构造函数。他们当然不是。

事实上,我找不到任何情况下标识符链(例如Class1.Class2)会有多个类型参数列表(例如<Integer>)。这种情况是否存在,或者语法没有意义?

作为参考, JLS第 15.9 节中给出的等效语法规则也存在同样的问题(这些规则引用了第 4.3 节TypeDecl中定义的非终结符)。

0 投票
2 回答
1678 浏览

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 都是一致的,这不是必需的,但拥有它是件好事。

0 投票
2 回答
1139 浏览

java - 限定名称和字段访问表达式有什么区别?

有关受保护访问的 JLS 详细信息中

令 C 为声明受保护成员的类。只有在 C 的子类 S 的主体内才允许访问。

此外,如果 Id 表示实例字段或实例方法,则:

如果通过限定名称 Q.Id 进行访问,其中 Q 是 ExpressionName,则当且仅当表达式 Q 的类型是 S 或 S 的子类时才允许访问。

如果通过字段访问表达式 E.Id(其中 E 是 Primary 表达式)或通过方法调用表达式 E.Id(. . .)(其中 E 是 Primary 表达式)进行访问,则当且仅如果 E 的类型是 S 或 S 的子类。

限定名称字段访问表达式有什么区别?

0 投票
2 回答
797 浏览

java - 为什么接口根据类文件格式扩展Object?

为什么 JVM 规范声明接口必须有一个super_classof 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 子句的方法。

0 投票
3 回答
233 浏览

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错了吗?

0 投票
3 回答
2014 浏览

java - Java 语言规范中是否有过“重大变化”?

除了引入 'assert' 关键字这一可能广为人知的例外,Java 语言规范中是否曾经发生过变化,导致旧代码不再与 JDK 的新源级别兼容?


到目前为止的总结(非常感谢您的评论):

在升级到更高版本时,如果代码使用在更高版本的 Java 语言规范 (JLS) 中引入的关键字之一进行声明,“旧”Java 代码可能会导致编译错误:

  • 断言
  • 枚举
  • 严格的fp
0 投票
2 回答
121 浏览

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 是数字数据类型。

我错过了什么?