在阅读并讨论Java 10s新保留类型名称var
(JEP 286:局部变量类型推断)之后,讨论中出现了一个问题.
与文字一起使用时,如:
var number = 42;
Run Code Online (Sandbox Code Playgroud)
是number现在的int还是一个Integer?如果您只是将它与比较运算符一起使用或作为参数使用它通常无关紧要,这要归功于自动装箱和开箱.但由于Integer成员职能,它可能很重要.
那么哪个类型是由原var语int或类创建的Integer?
在这个问题中,用户@Holger提供了一个答案,显示了匿名类的不常见用法,我不知道.
该答案使用流,但这个问题不是关于流,因为这个匿名类型构造可以在其他上下文中使用,即:
String s = "Digging into Java's intricacies";
Optional.of(new Object() { String field = s; })
.map(anonymous -> anonymous.field) // anonymous implied type
.ifPresent(System.out::println);
Run Code Online (Sandbox Code Playgroud)
令我惊讶的是,这会编译并打印预期的输出.
注意:我很清楚,自古以来,可以构造一个匿名内部类并使用其成员,如下所示:
int result = new Object() { int incr(int i) {return i + 1; } }.incr(3);
System.out.println(result); // 4
Run Code Online (Sandbox Code Playgroud)
但是,这不是我在这里问的问题.我的情况不同,因为匿名类型是通过Optional方法链传播的.
现在,我可以想象这个功能的一个非常有用的用法......很多时候,我需要map在Stream管道上发出一些操作,同时保留原始元素,即假设我有一个人员列表:
public class Person {
Long id;
String name, lastName;
// getters, setters, hashCode, equals...
}
List<Person> people = ...;
Run Code Online (Sandbox Code Playgroud)
而且我需要Person在某些存储库中存储我的实例的JSON表示,为此我需要每个Person …
我记得在某处读过带有推断类型的局部变量可以用相同类型的值重新分配,这是有意义的.
var x = 5;
x = 1; // Should compile, no?
Run Code Online (Sandbox Code Playgroud)
但是,我很好奇如果要重新分配x给不同类型的对象会发生什么.这样的东西还会编译吗?
var x = 5;
x = new Scanner(System.in); // What happens?
Run Code Online (Sandbox Code Playgroud)
我目前无法安装JDK 10的早期版本,并且不想等到明天才能找到答案.