首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >带有模式匹配的Java 17空情况

带有模式匹配的Java 17空情况
EN

Stack Overflow用户
提问于 2022-06-12 16:25:35
回答 2查看 1.3K关注 0票数 5

我有一个使用Eclipse2022-03和OpenJDK 17的Java 17项目:

代码语言:javascript
运行
AI代码解释
复制
openjdk 17.0.2 2022-01-18
OpenJDK Runtime Environment Temurin-17.0.2+8 (build 17.0.2+8)
OpenJDK 64-Bit Server VM Temurin-17.0.2+8 (build 17.0.2+8, mixed mode, sharing)

我正在尝试使用新的Java 17开关特性,所以我尝试了一种方法:

代码语言:javascript
运行
AI代码解释
复制
return switch(testEnum) {
  case foo -> newFoo();
  case bar -> newBar();
}

效果很好。但是,我尝试这样做(因为值可能是null):

代码语言:javascript
运行
AI代码解释
复制
return switch(testEnum) {
  case foo -> newFoo();
  case bar -> newBar();
  case null -> newDefault();
}

Eclipse用红色标记null,并说:

开关中的模式匹配是预览功能,默认情况下禁用。使用--启用-预览以启用

通过Maven编译生成:

代码语言:javascript
运行
AI代码解释
复制
[ERROR] /project/src/main/java/com/example/FooBar.java:[432,38] null in switch cases is a preview feature and is disabled by default.
[ERROR]   (use --enable-preview to enable null in switch cases)

我的Maven项目有:

代码语言:javascript
运行
AI代码解释
复制
<properties>
  <maven.compiler.release>17</maven.compiler.release>
</properties>

我知道编译器发行版设置不会被忽略;否则它将默认为Java 8(根据我的父POM),并且根本不允许模式匹配。

如果使用Java 17的模式匹配部分,空情况不是吗?我做错了什么?

EN

回答 2

Stack Overflow用户

发布于 2022-06-12 18:03:06

tl;dr

switch表达式!=模式匹配与switch

您将switch表达式的相对新特性与仍未发布的模式匹配特性与switch混合在一起。

Java中的switch特性经历了三个阶段的发展,其中两个阶段已经完成:

  • switch语句(Java1中的原始特性)
  • switch表达式(☑️14+)
  • 用于switch的❌模式匹配,包括case null (在Java17、18、19和20中预览)

不要将switch表达式与模式匹配混为一谈

经典switch

要理解的是,历史上,Javaswitch语句一直对null检查怀有敌意。看这个问题,https://stackoverflow.com/q/10332132/642706。如图所示,代码如下:

代码语言:javascript
运行
AI代码解释
复制
switch (i) {
    case null:
        doSomething0();
        break;    
}

…是不可能的。

switch表达式

switch表达式被添加到Java时,快速转发到Java 14。见https://openjdk.java.net/jeps/361。它允许您在第一个代码示例中看到的语法:

代码语言:javascript
运行
AI代码解释
复制
return switch(testEnum) {
  case foo -> newFoo();
  case bar -> newBar();
}

但是读JEP吧。没有提到null -蟋蟀。

switch中的模式匹配

快速前进,到https://openjdk.java.net/jeps/406。请注意,这是Java 17中的预览功能,而不是最后正式发布的特性。(要了解预览功能是如何工作的,请阅读https://openjdk.java.net/jeps/12。)

在JEP 406中,请注意它的第二个目标:允许在需要的时放松开关的历史无效敌意。

现在搜索该页面以查找“空”- 73命中!该页解释了以前Java语言的策略:

传统上,如果选择器表达式的计算结果为switch…,则NullPointerException语句和表达式将抛出null…。

请注意语句、原始switch语法和附加表达式,以及代码中使用的新语法。在这两种情况下,null检查都被禁止。

该页面将继续解释促使包含对空检查的支持的更改。阅读JEP的遗嘱详细信息。

其结果是,您可以在Java17中的case null中使用switch --但只有在您不择手段地使用时,才能启用预览功能

仍在预览中,在Java 20中

https://en.wikipedia.org/wiki/Orson_Welles_Paul_Masson_advertisements#1978:_Original_ad%E2%80%94Beethoven,_Emerald_Dry

在Java 20中,您也将不得不不择手段地使用激活预览功能

当然还有两次提醒:

  • 预览功能不应用于关键应用程序的生产。
  • 预览功能可能会改变。这就是他们的目的,收集导致改变的反馈和建议。

示例

让我们来看看这个代码示例。注意我们如何在这里使用普通的旧语法,而不使用->。箭头操作符与我们在这里的讨论无关。

代码语言:javascript
运行
AI代码解释
复制
String x = null;
switch ( x )
{
    case "starburst":
        System.out.println( "Is starburst." );
        break;
    case null:
        System.out.println( "Whoops, null." );
        break;
    default:
        System.out.println( "Some other value found." );
        break;
}

在Java 17中,默认情况下,在不启用预览特性的情况下,我们在编辑case null代码时会出现此错误

在语言级别“17”不支持开关中的模式 将语言级别设置为17 (预览)-切换模式匹配

在启用Java 17中的预览功能之后,代码将毫无怨言地编译。它运行着:

喔,零。

票数 9
EN

Stack Overflow用户

发布于 2022-06-12 17:24:07

此命令行适用于我:

代码语言:javascript
运行
AI代码解释
复制
$ javac -version
javac 17.0.3
$ javac  -source 17 -Xlint:preview --enable-preview org/kablambda/Main.java
org/kablambda/Main.java:10: warning: [preview] null in switch cases is a preview feature and may be removed in a future release.
            case null -> "c";
                 ^
1 warning
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72596788

复制
相关文章
Java内存缓存-通过Google Guava创建缓存
Guava是Google guava中的一个内存缓存模块,用于将数据缓存到JVM内存中。实际项目开发中经常将一些公共或者常用的数据缓存起来方便快速访问。
小码农薛尧
2019/08/27
2.9K0
Java内存缓存-通过Google Guava创建缓存
怎么获得google adsense账户的批准!
不得不说,Adsense是最佳联盟广告。因为它的CPC单价比任何联盟广告都要高。相对中文网站,英文网站更加容易获得google adsense的许可,因为谷歌官方做出了明确的指示,中国地区网站域名年龄必须有六个月以上的年龄才能获得许可。所以英文网站有天然的优势。
Hoan外贸建站
2020/12/04
2.4K0
看我如何发现Google云平台漏洞并获得$7500赏金
本文讲述了一名乌拉圭17岁高中生,因对信息安全感兴趣,通过学习研究,独立发现谷歌云平台漏洞并获得$7500美金(此前,他曾发现了价值$10000美金的谷歌主机头泄露漏洞)。在谈论该漏洞的具体细节之前,希望读者对谷歌云服务和API机制相关能有所了解,可以先来熟悉几个相关概念。 先导概念 谷歌运行有一个名为Google Service Management的管理服务,谷歌通过它来管理各种应用谷歌系统的内外部接口和用户自行创建的云端服务。在Google Service Management下,用户可以在自己的
FB客服
2018/03/22
2.3K0
看我如何发现Google云平台漏洞并获得$7500赏金
2020 Google 编程之夏活动总结
随着十月份导师峰会与课题回顾的结束,现在我们宣布 Google 编程之夏 2020 活动在 Jenkins 社区圆满结束。我们谨代表 Jenkins 团队,感谢所有今年参与到此次活动的参与者们: 学生、导师、申请者以及各位贡献者。Google 编程之夏活动的顺利举行离不开 Jenkins 社区各位成员的积极参与。
LinuxSuRen
2021/04/13
5830
2020 Google 编程之夏活动总结
如何通过Google Search Console分析搜索流量降低的情况?
首先打开Google Search Console 然后看到我们已经验证好的站点 然后就有以下的图表分析出现。
雾海梦曦
2022/11/14
5010
如何通过Google Search Console分析搜索流量降低的情况?
Google 就是 Google
Google 就是 Google 啊!今天在浏览新闻的时候,突然看到这么 一条新闻:
非著名程序员
2018/12/19
1.1K0
Google 就是 Google
Edge ,Google Chrome 打不开所有网页
1、打开注册表,增加如下项HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Edge 2、再DWORD(32位)值,命名RendererCodeIntegrityEnabled,值为0 3、重启edge即可。
上善若水.夏
2020/06/16
2.3K0
使用Google JS api 创建 文档
https://developers.google.com/docs/api/reference/rest/v1/documents/request#Request
拿我格子衫来
2022/01/24
3.4K0
使用Google JS api 创建 文档
如何让机器获得幽默感——Google图学习技术揭秘
原文: Graph-powered Machine Learning at Google 作者: Sujith Ravi 译者: KK4SBB 责编:何永灿,关注人工智能,投稿请联系heyc@csdn.net或微信号289416419 近些年来,机器学习技术取得了巨大的进步,使得计算机系统能够解决复杂的现实问题。其中一项先进技术就是由Google研究院的Expander组开发的大规模、基于图的机器学习平台。基于图的机器学习是一款功能强大的工具,被广泛用于我们日常接触到的Google产品和功能,比如用于收
用户1737318
2018/06/06
6050
【Google Play】创建 Google 开发者账号 ( 注册邮箱账号 | 创建开发者账号 )
【Google Play】创建 Google 开发者账号 ( 注册邮箱账号 | 创建开发者账号 )
韩曙亮
2023/03/29
15.2K0
【Google Play】创建 Google 开发者账号 ( 注册邮箱账号 | 创建开发者账号 )
Google 的 Firebase 如何删除项目
https://www.ossez.com/t/google-firebase/13792
HoneyMoose
2021/11/02
3.3K0
Google 的 Firebase 如何删除项目
google scholar_google
DOI全称为Digital Object Unique Identifier,即数字对象唯一标识符,通俗一点来讲,DOI就是一篇文献的身份证
全栈程序员站长
2022/11/10
6800
如何关闭google的安全搜索
我们平常使用google搜索,默认是已启用安全搜索的。例如在google搜索“1”,右上角会出现“已启用安全搜索”。 进入google帮助找到安全搜索内容https://support.google.com/websearch/answer/510 屏蔽 Google 上的色情内容 您可以使用安全搜索设置来滤除 Google 上包含露骨内容的搜索结果(例如色情内容)。安全搜索并非 100% 准确,但它能帮您屏蔽掉大多数成人内容。 您可将安全搜索用作一种家长控制方式,以使孩子远离您手机
小歪
2018/04/04
9.2K0
如何关闭google的安全搜索
在Managed Code通过Google Gmail发送邮件以及如何通过Outlook配置Gmail
在项目开发中,发送邮件时一种非常常见的功能。一般的情况下,大型的公司都有自己的邮件系统,我们可以直接通过公司的Pop/SMTP Server进行邮件的发送和接收。不过,对于一些小公司不具有这样的条件,他们一般通过一些公共的邮件服务通过商提供的邮件服务。比如Sina,163就是很好的、常用的邮件服务。不过相比之下,我还是习惯使用Google Gmail。 接下来,我将介绍两方面来介绍今天的内容,如果通过Managed code通过Gmail进行邮件的发送,以及如何在Outlook中配置Gmail。今天介绍的东
蒋金楠
2018/02/07
1.8K0
在Managed Code通过Google Gmail发送邮件以及如何通过Outlook配置Gmail
如何通过Google来使用ggplot2可视化
今天是大年初二,这篇文章我只想传达一点: 没有什么菜鸟级别的生物信息学数据处理是不能通过Google得到解决方案的,如果有,请换个关键词继续Google! 第一部分 首先用两分钟的时间简单介绍一下R语言: 因为这个语言是肉丝儿(Ross Ihaka)和萝卜特(Robert Gentleman)两个人1992年在S语言的基础上发明出来的开源语言,所以叫做R语言。这两个人是统计学教授出身,所以R语言在统计学方面有着纯正的血统!如果你平时的工作和统计相关,你好意思不会点R语言么? 另外,在R语言的官网上,有这样一
生信技能树
2018/03/08
2K0
如何通过Google来使用ggplot2可视化
如何切换google play地区?
后来我使用我的 Nexus 6 手机注册:设置->帐号->添加帐号->Google->创建帐号,成功注册。
崔哥
2022/09/08
2.3K0
通过 SeeTheStats 公开 Google Analytics 统计结果
广告商投放广告的时候,需要了解投放网站的流量,了解网站的流量的方法有很多,一般可以通过 Alexa,Google Ad Planer,但是这些都不是十分准确的,比如有个广告商通过 Alexa 的数据,以为我的博客一天的流量有 3W, 🙂 。 了解网站流量最直接的方法就是能够查看到统计工具的报表,如果要给广告商 Google Analytics 的统计结果,需要在 Google Analytics 后台操作给他的 Google 帐号赋权查看结果,这样非常麻烦。 SeeTheStats 就是一个使用 Googl
Denis
2023/04/14
4510
通过 SeeTheStats 公开 Google Analytics 统计结果
点击加载更多

相似问题

Python中int的大小是多少?

15

SQL Int(N)的大小是多少?

12

c++:int[3]的大小是多少(int[3])

30

根据C标准,int的大小是多少?

25

Nullable<Int32>的大小是多少?

42
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档