DosEquiz.java
<!---->public class DosEquis
{
public static void main(String[] args)
{
char x = 'X';
int i = 89;
final int j = 89;
final int k = 6666666;
System.out.println(true ? x : 88); // X
System.out.println(false ? i : x); // 88
System.out.println(true ? j : x); // Y
System.out.println(false ? j : x); // X
System.out.println(true ? k : x); // 6666666
System.out.println(false ? k : x); // 88
//System.out.println((true ? true : new Boolean(true)).booleanValue()); \\ a compile-time error
//System.out.println((true ? false : new Boolean(true)).booleanValue()); \\ a compile-time error
System.out.println(new Boolean((true ? true : new Boolean(true))).booleanValue()); //ok
//Double aInt = true ? new Integer(1) : null; -- a compile-time error
//Double aInt = false ? new Integer(1) : null; -- a compile-time error
}
}
这个谜题是关于
Conditional Operator ? :[JLS 15.25]。
1、Conditional Operator 有三个运算符表达式,第一个必须是 boolean或 Boolean型的,否则引发一个compile-time error 。
2、一个 Conditional Expression的类型T是由第二个表达式 T2和第三个表达式T3的类型来决定的。具体规则如下:
- rule 1: 如果T2 == T3(包括T2 == T3 == null的情况),那么 T = T2(T3)。
- rule 2: 如果 T2与T3这两个之中有一个是boolean型,另外一个是Boolean型,那么 T = boolean。
- rule 3: 如果T2与T3之中有一个是null类型,而另外一个是一个引用类型(reference type) RT,那么T = RT
- 如果T2与T3是可以转化成数值类型的,那么结果有以下几种情况:
- rule 4: 如果T2与T3有一个是byte或者Byte,另一个是short或者Short,那么T = short
- rule 5: 如果T2与T3中有一个是 GT 型,这里 GT 泛指byte, short, char中的任何一个, 而且另一个是一个int型的常量表达式(注意,必须是一个 int型的constant expression),而且 该常量表达式可以用GT表示(即不会产生精度损失的情况,个人的理解^_^),则T=GT。
- rule 6: 如果T2和T3有一个是Byte型,另一个是可以用byte型表示的int型常量表达式,那么T=byte
- rule 7: 如果T2和T3有一个是Short型,另一个是可以用byte型表示的int型常量表达式,那么T=short
- rule 8: 如果T2和T3有一个是Character型,另一个是可以用char型表示的int型常量表达式,那么T=char
- rule 9: Otherwise, binary numeric promotion (JLS 5.6.2) is applied to the operand
types, and the type of the conditional expression is the promoted type of the
second and third operands. Note that binary numeric promotion performs unboxing
conversion (JLS 5.1.8)
and value set conversion (JLS 5.1.13).(这个很多词语都不知该怎么翻译,就直接copy过了。。。)
rule 10: Otherwise, the second and third operands are of types S1 and S2 respectively.
Let T1 be the type that results from applying
boxing conversion to S1, and let T2 be the type that results from applying boxing
conversion to S2. The type of the conditional
expression is the result of applying capture conversion (JLS 5.1.10) to lub(T1, T2) (JLS 15.12.2.7).
相关推荐
### Java Puzzlers知识点解析 #### 一、Java Puzzlers概述 《JavaSIG-Puzzlers.pdf》是一本由Joshua Bloch与Neal Gafter共同编写的书籍,该书主要探讨了Java编程语言中的一些非常规问题。这些问题是开发者在日常...
Expressive Puzzlers Puzzle 1: Oddity Puzzle 2: Time for a Change Puzzle 3: Long Division Puzzle 4: It's Elementary Puzzle 5: The Joy of Hex Puzzle 6: Multicast Puzzle 7: Swap Meat Puzzle 8: Dos Equis...
2 expressive puzzlers puzzle 1:oddity puzzle 2:time for a change puzzle 3:long pision puzzle 4:it s elementary puzzle 5:the joy of hex puzzle 6:multicast puzzle 7:swap meat puzzle 8:dos equis...
2. **表达式验证**:Expressive Annotations的亮点在于其使用自然语言表达式定义验证规则。这种方式使得代码更具可读性,也更易于理解和维护,减少了因复杂验证逻辑导致的潜在错误。 3. **客户端组件**:这里的...
Low-Rank Adaptation (LoRA), a parameter-efficient fine-... This paper takes the first step to bridge this gap by theoretically analyzing the expressive power of LoRA. We prove that, for fully connected
Swoole + Zend Expressive 该软件包为Swoole提供了Zend Expressive 3跑步者。 安装 安装Swoole $ pecl install swoole-2.1.1 安装Zend Expressive $ composer create-project zendframework/zend-expressive-...
Super Expressive是一个JavaScript库,可让您以几乎自然的语言构建正则表达式-无需任何额外的依赖关系,并且代码占用量小(压缩+ gzip不到3kb!)。 Super Expressive Super Expressive是一个JavaScript库,可让您以...
easy_to_use,_powerful_&_expressive_command_line_ar_clipp
expressive-date, php DateTime类的流畅扩展 表示日期php DateTime类的流畅扩展。 目录安装工具Composer手动加载 Laravel 4使用情况获取实例快速帮助程序克隆处理日期日期和日期之间的差异( )比较日期与日期交互。...
快速_数字_信号_处理_(DSP)_包_音频_Expressive_Digital_Signal_Processing_(DSP)_package_audiolazy.zip
Speaker: 鲁葳, an agile developer working for Neo. RSpec is a popular tool for TDD with ruby. In this talk, we start with subject and let. Then we dive into should_receive vs. asserting side effects....
Expressive是基于ExpressJ和最佳实践构建的NodeJS REST API框架,可实现顺畅的开发。 功能包括: 模板路由轻松编写具有声明性终结点(包括嵌套终结点)的API 具有内置功能的可插拔中间件 像Express一样注入自己的...
现在它确实支持Zend Expressive 3.* 要与Zend Expressive 1.*一起使用,请安装版本1.1.4要与Zend Expressive 2.*一起使用,请安装版本2.0.0 loggables设置由狂饮日志格式的启发。 您可以在要从配置文件中记录的请求...
expressive-ts是一个功能编程库,旨在简化构建复杂的正则表达式。 表现力 目录 安装 npm install fp-ts expressive-ts 或者 yarn add fp-ts expressive-ts 注意: fp-ts是expressive-ts的对等依赖项 为什么? ...
2. **Expressive框架**:学习其核心组件,如中间件、路由、依赖注入容器、服务提供者等。 3. **路由配置**:如何定义路由规则,将URL映射到特定的控制器操作。 4. **中间件**:理解Expressive中的中间件概念,它们是...
2. `overview.html`: 这是项目的概述文档,可能包含项目的目标、特点、使用方法等信息。 3. `expressiveXml.html`: 可能包含关于如何使用XML配置文件来定制或生成GUI的信息。 4. `expression.jnlp`: Java网络启动...
Expressive Puzzlers Puzzle 1: Oddity Puzzle 2: Time for a Change Puzzle 3: Long Division Puzzle 4: It's Elementary Puzzle 5: The Joy of Hex Puzzle 6: Multicast Puzzle 7: Swap Meat ...
cd dms-expressive-skeleton composer install 更新.env文件 打开.env文件,然后根据您的数据库修改用户名和密码。 移民 # Make migration script ./console dms:make:migration init # Check status of migration ...
要与zend expressive的较早版本一起使用,请参阅版本0.1.9。 要求 PHP 7.1或以上 安装 使用composer安装最新版本。 有关如何获取作曲家或如何使用它的信息,请访问 。 $ composer require dwendrich/expressive-...