Java 10使用关键字var
引入了局部变量类型推断 。 这意味着无需编写:
Map<Department, List<Employee>> map = new HashMap<>();
// ...
for (Entry<Department, List<Employee>> dept : map.entrySet()) {List<Employee> employees = dept.getValue();// ...
}
您可以使用var
减少样板,如下所示:
var map = new HashMap<Department, Employee>();
// ...
for (var dept : map.entrySet()) {var employees = dept.getValue();// ...
}
var
消除了在代码中编写显式类型的需要。 这不仅减少了重复,而且还使您的代码更易于维护,因为例如,如果您决定将来更改存储在地图中的对象的类型,则只需要更改一行代码即可。
多态性:
现在让我们看一下var
在多态代码中的行为。 例如,如果您有一个Shape
类,其中包含两个子类Square
和Circle
,则使用var v = new Circle()
会推断出什么类型? 让我们在JShell中尝试一下:
jshell> var v = new Circle();
v ==> Circle@4e9ba398jshell> v.getClass();
$13 ==> class Circlejshell> v = new Square();
| Error:
| incompatible types: Square cannot be converted to Circle
| v = new Square();
| ^----------^
如上所示, v
属于Circle
类型,如果您尝试将其重新分配给Square
,则编译器将引发错误。
匿名类:
使用var
可以做的令人兴奋的事情之一就是创建匿名类并引用其中的字段! 例如:
var person = new Object() {String name = "Joe";int age = 10;
};
System.out.println(person.name + ":" + person.age);
var
推断出匿名类的类型,这意味着您可以将匿名类用作中间值的“持有人”,而无需创建和维护新类。 这是另一个示例,显示了如何创建“临时”人物对象:
var persons = Stream.of("Alice", "Bob", "Charles").map(s -> new Object() {String name = s;int age = 10;}).collect(toList());
persons.forEach(p -> System.out.println(p.name));
其他注意事项:
如果没有显式初始化(分配为null
)或在lambda表达式中,则无法使用var
:
jshell> var v;
| Error:
| cannot infer type for local variable v
| (cannot use 'var' on variable without initializer)
| var v;
| ^----^jshell> var v = null;
| Error:
| cannot infer type for local variable v
| (variable initializer is 'null')
| var v = null;
| ^-----------^jshell> var v = () -> {}
| Error:
| cannot infer type for local variable v
| (lambda expression needs an explicit target-type)
| var v = () -> {};
| ^---------------^
翻译自: https://www.javacodegeeks.com/2018/05/java-10-the-var-keyword.html