问题标签 [language-specifications]
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 - 是否从 Object 转换为布尔有效的 Java 语言?
我在几年前由 C 程序员实现的工作中偶然发现了一个旧的 Java 代码,我们不禁开始讨论该代码 - 即使它可以编译和工作 - 是否实际上是有效的 Java 代码。
这基本上是有问题的代码。正如您所看到的,从 Object 到原始布尔值的转换不太好,这应该是不可能的,但由于一些隐式的装箱魔法,它恰好可以工作。
如果我执行以下操作
我什至在将 o 转换为 b 的行上收到警告,说“Cast is incompatible with given instanceof”。这显然是正确的,但由于隐式装箱,它仍然有效。
现在的问题是:Java 规范是否真的允许这种转换,因此应该适用于未来的 JVM 版本?或者它只是碰巧在当前版本中工作,而在未来的 JVM 更新中可能不再工作?
java - 如何在 Java 中表示上下文无关文法?
我有一个简单的语法:
我们唯一的终端是atom。这是一种递归语法,因为每个 R 都可以由嵌套的 R 组成。我面临的问题是:
- 如何处理递归?
- 如何构建可以通过 3 条规则之一解决的 java 类 R?
你会如何用 Java 类来表示这个语法?
ruby-on-rails - Rails i18n 错误消息的变形
有谁知道如何为模型中的属性定义性别?因此,当出现错误消息时,我可以给他们一个特定的性别,例如:
La dirección no puede estar en blanco(地址不能留空) - 地址中有一篇女性文章用西班牙语
El usuario no puede estar en blanco(用户不能留空) - 用户有一篇西班牙语男性化的文章
所有这些都在特定的 rails /config/locales/language.yml 文件中使用 i18n 变形
- - - 额外的 - - - - -
请不要重复,因为我没有按照“可能重复”的建议定义 key_vale 关系,我正在使用模型中的实际属性,因此当我使用以下内容时:
我可以在实际消息之前获得一篇文章(基于性别),问题是如您所见,我真的无法直接访问属性。
c# - C# 中外部静态构造函数的目的是什么?
根据“C# 语言规范。版本 5.0”的“10.12 静态构造函数”部分,静态构造函数可以用“extern”修饰符标记,在这种情况下,它被称为外部静态构造函数。
普通(非外部)静态构造函数是众所周知的。它们用于初始化静态字段和属性。
外部静态方法通常用于通过 P/Invoke 调用本机函数。
而且我也知道相当深奥的外部构造函数(另见这个问题)。例如,String
类有几个这样的声明,这些构造函数是由运行时实现的。
但是外部静态构造函数有真正的用途吗?我搜索了coreclr repo,一无所获。语言规范无法描述一些从未在野外使用过的构造。或者可以吗?
我的猜测:C# 有外部静态构造函数只是因为 CLR 支持它们(原则上)。
java - 使用静态方法更改类以在 Java 中进行接口的二进制兼容性
我遇到了以下 Java/JVM 规范不完整的奇怪案例。假设我们有类(我们将使用 Java 1.8 和 HotSpot):
然后重新编译Class to be an interface without recompiling the
User`:
运行User.main
now 会产生相同的输出hi
。这似乎很明显,但我希望它会失败,IncompatibleClassChangeError
这就是为什么:
根据JVM 5.3.5#3 声明,我知道将类更改为接口是二进制不兼容:
如果命名为 C 的直接超类的类或接口实际上是一个接口,则加载会抛出一个
IncompatibleClassChangeError
.
但是让我们假设我们没有Class
. 我们现在必须参考 JVM 规范关于方法的解析。第一个版本被编译成这个字节码:
所以我们在这里有一个叫做CONSTANT_Methodref_info
类池的东西。
让我们引用invokestatic的动作。
...该索引处的运行时常量池项必须是对方法或接口方法(第 5.1 节)的符号引用,它给出了方法的名称和描述符(第 4.3.3 节)以及符号对要在其中找到方法的类或接口的引用。命名方法已解析 (§5.4.3.3)。
所以JVM以不同的方式对待方法和接口方法。在我们的例子中,JVM 将方法视为类的方法(不是接口)。JVM 尝试相应地解决它 5.4.3.3 方法解析:
根据 JVM 规范,JVM 必须在以下语句上失败:
1) 如果 C 是接口,方法解析会抛出 IncompatibleClassChangeError。
...因为Class
实际上不是一个类,而是一个接口。
不幸的是,我没有在 Java 语言规范第 13 章中找到关于将类更改为接口的二进制兼容性的任何提及。二进制兼容性。此外,对于引用相同静态方法的这种棘手情况,也没有任何说法。
如果我错过了什么,有人可以详细说明并告诉我吗?
java - 为什么空数组引用的数组访问表达式不抛出 NullPointerException?
考虑以下代码:
NullPointerException
根据JLS Sec 15.7.1,我原以为这会引发:
在评估右侧操作数的任何部分之前,二元运算符的左侧操作数似乎已被完全评估。
=
是一个二元运算符(在JLS Sec 15.2中显示- JLS Sec 15.26 描述了赋值运算符),并且完全评估左侧操作数将导致NullPointerException
. 但是,ArithmeticException
抛出 an ,表示在完全评估左侧操作数之前评估右侧操作数。
为什么?
java - 为什么可以导入与嵌套类同名的类?
考虑以下代码:
这段代码编译得很好;但如果你指的Calendar
是Demo
inside,你指的是Demo.Calendar
,不是java.util.Calendar
。
导入显然是多余的;但考虑到您不允许导入与在同一编译单元中定义的顶级类具有相同简单名称的类(根据JLS Sec 7.5.1),这似乎很奇怪:
为什么像第一个代码示例中这样的导入不会是编译时错误,是否有实际原因?
javascript - 如果单线程和非阻塞是 JavaScript 的定义特性,为什么规范中没有这些术语?
JavaScript 正在成为一个复杂的生态系统。最近我从官方语言规范中阅读了更多内容,并学习了更多关于浏览器实现的知识。
有人可以帮助我了解指定非阻塞和单线程的位置吗?还有其他一些我应该看的规范吗?
java - 为什么添加“.map(a -> a)”可以编译?
这与我对“流减少不兼容类型”的回答有关。我不知道为什么我的建议有效,Holger正确地向我施压。但即使他似乎也没有明确解释它为什么起作用。所以,让我们把它当作自己的问题来问:
以下代码无法编译javac
(对于下面指向 ideone 的链接,这是sun-jdk-1.8.0_51
,根据http://ideone.com/faq):
这是正确的:从这个流中将两个谓词进行或运算就像是这样写:
Predicate::or
但是,它确实在 intellij 中编译,尽管在方法引用上带有原始类型警告。显然,它也会在 eclipse 中编译(根据原始问题)。
但是这段代码确实:
尽管我想尝试一下,但我并不完全清楚为什么这会起作用。我的手动解释是,.map(a -> a)
它就像一个“演员”,并为类型推断算法提供了更多的灵活性来选择允许reduce
应用的类型。但我不确定这种类型到底是什么。
请注意,这不等同于 using .map(Function.identity())
,因为它被限制为返回输入类型。ideone demo
任何人都可以解释为什么这可以参考语言规范,或者如果按照 Holger 的建议,它是一个编译器错误?
更详细一点:
方法的返回类型可以更具体一点;我在上面省略了它,这样返回类型上的讨厌的泛型就不会妨碍:
这是用 编译的输出-XDverboseResolution=all
。不完全确定这是否是我可以发布以调试类型推断的最相关输出;请告知是否有更好的东西: