gpt4 book ai didi

java - 为什么 instanceof 模式匹配需要标识符?

转载 作者:行者123 更新时间:2023-12-05 03:23:43 26 4
gpt4 key购买 nike

在Java的instanceof模式匹配中,使用了一个额外的标识符来缩小类型:

Object o = "test";
if (o instanceof String s) {
System.out.println(s.length()); // s is of type String
}

为什么有必要? The JEP似乎没有理由,但我敢肯定这是有原因的。以下内容有何不足之处?

Object o = "test";
if (o instanceof String) {
System.out.println(o.length());
}

TypeScriptKotlin在没有其他标识符的情况下做类似的事情。

我猜这是一个向后兼容的问题——Java 的怪癖通常是——但我想不出一个例子来证明这一点。

我唯一能想到的是,有人可能已经编写了类似于第二个示例前模式匹配的东西,并依赖它编译,但这似乎是一个薄弱的理由。

最佳答案

如果 Java 引入了类似于“智能 instanceof”的东西,我们可以争辩说这个特性可以在不引入新变量的情况下发挥作用。

但这不是介绍的内容。新功能是模式匹配,这是一个更大的概念,尽管只是在第一步中以最简单的形式实现。这也是一种新的集成方法,不是在大功能上工作数十年,而是在保持大愿景的同时不断将较小的功能添加到 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);
}
}

由于模式匹配包括创建(有时是多个)新变量,因此仅创建一个包含与现有变量相同引用的新变量的情况只是一种极端情况。即使到目前为止已经实现的,也涵盖了比这更多的案例。例如

if(foo.getObject() instanceof List<?> l && l.get(0) instanceof Map<?,?> m
&& m.get("foo") instanceof String s) {
// use s
}

还值得注意的是,模式变量的范围 is complex .如果变量也存在于此范围之外,但类型不同,那就更令人困惑了。

因此,在存在 instanceof 的情况下根据上下文更改变量的类型虽然很诱人,但会引起问题(一些评论还提到了方法重载选择),同时又不会符合Java语言开发者的实际愿景。

关于java - 为什么 instanceof 模式匹配需要标识符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72446857/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com