如果Java引入了类似"智能instanceof"的东西,我们可以说这个特性可以在不引入新变量的情况下工作.
但这并不是我们所介绍的.新特性是Pattern Matching,这是一个更大的概念,尽管在第一步中仅以最简单的形式实现.这也是一种新的集成方法,而不是几十年来一直致力于大功能,更小的功能不断添加到Java中,同时保持了大的愿景.
JDK-8260244描述了接下来的步骤之一,这将允许
(给定)
record Point(int x, int y) {}
void printSum(Object o) {
if (o instanceof Point(int x, int y)) {
System.out.println(x+y);
}
}
甚至
(给定)
record Point(int x, int y) {}
enum Color { RED, GREEN, BLUE }
record ColoredPoint(Point p, Color c) {}
record Rectangle(ColoredPoint upperLeft, ColoredPoint lowerRight) {}
static void printXCoordOfUpperLeftPointWithPatterns(Rectangle r) {
if (r instanceof Rectangle(ColoredPoint(Point(var x, var y), var c), var lr)) {
System.out.println("Upper-left corner: " + x);
}
}
由于Pattern Matching包括创建(有时是多个)新变量,因此仅创建一个新变量并包含与已存在变量相同的引用的情况只是一种极端情况.
if(foo.getObject() instanceof List<?> l && l.get(0) instanceof Map<?,?> m
&& m.get("foo") instanceof String s) {
// use s
}
还值得注意的是,模式变量的范围为is complex.如果变量也存在于这个范围之外,但具有不同的类型,则会更加混乱.
因此,在instanceof
存在的情况下改变变量的类型虽然很诱人,但会导致问题(一些 comments 还提到了方法重载 Select ),同时,也不符合Java语言开发人员的实际愿景.