Java SE 11 的JLS §5.2包含一些 Java 8 的 JLS 没有的新类型转换案例,请参阅列表中的第 4 项和第 5 项:
赋值上下文允许使用以下之一:
- 身份转换
- 扩大原始转换
- 扩大参考转换
- 一个扩大的参考转换,然后是一个拆箱转换
- 扩展引用转换,然后是拆箱转换,然后是扩展基元转换
- 拳击转换
- 一个装箱转换,然后是一个扩大的参考转换
- 拆箱转换
- 一个拆箱转换,然后是一个扩大的原始转换
我不明白列表中的案例 4和案例 5。谁能用例子给我一些解释?如果可能,还请说明其实际用途。
更新:
正如@Naman 所评论的,这里是更改 JLS 的提议 - JDK-8166326:5.2:允许在拆箱前加宽,这是自 Java-9 以来生效的。在报告中,它提到:
这种行为对于与 capture 的互操作性尤其重要:各种现有程序都希望能够将 a 的元素
List<? extends Integer>
视为整数。Run Code Online (Sandbox Code Playgroud)List<? extends Integer> li = null; int i = li.get(0);
这可能暗示着这次 JLS 的改变确实有实际的必要性。但我还是不明白为什么 <? extends Integer> 很重要。什么是与捕获的互操作性意味着,它为什么如此重要?这些现有的各种程序是什么样的?它们是 Java …
我遇到了以下代码不起作用的问题。我在Java SE 11 (11.0.8)、Eclipse 2020-06、Windows 10 中运行了代码。
将字符串最终变量与三元运算符一起使用:不起作用
public class Tester {
public static void main(String[] args) {
String switchVar = "abc";
final String caseStr = true ? "abc" : "def";
switch (switchVar) {
case caseStr: System.out.println("Doesn't work");
}
}
}
Run Code Online (Sandbox Code Playgroud)
它有一个编译时错误:java.lang.Error: Unresolved compilation problem: case expressions must be constant expressions
。
但是,根据JLS §4.12.4和JLS §15.28,String 类型可以是最终变量,三元运算符也可以算作常量表达式。
常量变量是用常量表达式初始化的原始类型或字符串类型的最终变量。
常量表达式是表示原始类型的值或不会突然完成并且仅使用以下内容组成的字符串的表达式:
...
三元条件运算符 ? :
引用常量变量的简单名称
我做了一些更多的测试,结果表明如果不结合在一起,这些点中的任何一个都可以工作。
直接使用常量表达式作为 case 常量:没问题
public …
Run Code Online (Sandbox Code Playgroud) 我想使用Java 9中的新工厂方法创建一个不变的hashMap内联Map.ofEntries()
,例如:
Map<Integer, String> map = Map.ofEntries(
Map.entry(1, "One"),
Map.entry(2, "Two"),
Map.entry(3, "Three"));
Run Code Online (Sandbox Code Playgroud)
令我惊讶的是,我发现我无法以相同的方式创建不可变的hashMap!例如,以下代码将不起作用。
HashMap<Integer, String> map = HashMap.ofEntries( //not work
Map.entry(1, "One"),
Map.entry(2, "Two"),
Map.entry(3, "Three"));
Run Code Online (Sandbox Code Playgroud)
然后,当我想检查工厂方法返回的地图类型时,发现以下注意事项:
调用者不应对返回实例的身份做任何假设。
所以我的问题是,不可变映射的访问时间复杂度是否与o(1)的hashMap相同?如果不是,如何创建不可变且同时访问o(1)的映射?最好可以内联创建。
java ×2
java-11 ×2
autoboxing ×1
dictionary ×1
eclipse ×1
hashmap ×1
immutability ×1
java-9 ×1
jls ×1
string ×1