首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >带有模式匹配的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

复制
相关文章
int和int32的区别_int是多少位的
大家有没有写了很久代码,还不知道这个Int8,Int16, Int32, Int64有什么区别呢?或者是为什么后面的数字不一样呢?
全栈程序员站长
2022/09/21
3.1K0
UDP/TCP 包的大小限制是多少?
素材来源:https://blog.csdn.net/learnlhc/article/details/115228649
李肖遥
2022/12/22
5.6K0
UDP/TCP 包的大小限制是多少?
python中int的取值范围_int32的取值范围是多少?
int32的数值取值范围为“-2147483648”到“2147483647”;而int64的数值取值范围为“-9223372036854775808”到“9223372036854775808”。
全栈程序员站长
2022/09/29
3.2K0
python中int的取值范围_int32的取值范围是多少?
以太坊合约交易大小的上限是多少?
在以太坊上发送的交易,最多能包含多少字节的数据?有没有上限? 理论上在以太坊中,对交易大小或者块大小都没有直接或固定的上限,这也是 以太坊的一个优势。 不过这并不意味着交易能携带数据量大小没有上限,因为一个块可以使用的 gas是有上限的。 在写这篇文章时,ethstats显示 这个值是7,984,452,大约700万。 因此,理论上我们可以创建一个交易,让它消耗掉一个块能用的全部gas,这就 决定了一个交易理论上可以包含的最多数据。 决定数据大小的另一个因素是数据内容,因为不同的数据消耗的gas也不同: 0
用户1408045
2018/05/17
2.1K0
int是什么_uint16范围是多少
Int32 值类型表示-2,147,483,648 ~ +2,147,483,647 之间的整数。
全栈程序员站长
2022/09/21
1.2K0
2018-12-19 java int long 的最大值是多少
public static void main(String[] args) { BigDecimal lll = new BigDecimal("9999999999999999999999999999"); System.out.println(Long.MAX_VALUE); System.out.println(BigDecimal.valueOf(2).pow(63)); System.out.print
Albert陈凯
2018/12/27
1.8K0
int a; int* a; int** a; int (*a)[]; int (*a)(int)
a) int a;表示一个内存空间,这个空间用来存放一个整数(int); b) int* a;表示一个内存空间,这个空间用来存放一个指针,这个指针指向一个存放整数的空间,即a)中提到的空间; c) int** a;表示一个内存空间,这个空间用来存放一个指针,这个指针指向一个存放指针的空间,并且指向的这个空间中的指针,指向一个整数。也简单的说,指向了一个b)中提到的空间; d) int (*a)[4];表示一个内存空间,这个空间用来存放一个指针,这个指针指向一个长度为4、类型为int的数组;和int** a的区别在于,++、+=1之后的结果不一样,其他用法基本相同。 以上四种类型见上图表示。 e) int (*a)(int);表示一个内存空间,这个空间用来存放一个指针,这个指针指向一个函数,这个函数有一个类型为int的参数,并且函数的返回类型也是int。
Twcat_tree
2022/11/30
2.3K0
int a; int* a; int** a; int (*a)[]; int (*a)(int)
Arraylist有用过吗?它是干嘛的?为什么线程不安全还用?默认存储长度是多少?ArrayList(int initialCapacity)实例化如果初始化大小会不是初始化数组大小?
1、有用过,Arrylist是数组列表,用来存储数据的,当我们存储的是基本数据类型时我们存储的是他们的包装类,它的底层实现是Object[] elementData. 与Linketlist相比,它查找和访问数据快,删除和修改数据慢。
用户9131103
2023/07/17
1100
C++ 标准是怎么规定类型 int 和 long 的长度大小的
问题 C++ 标准是怎么规定类型 int 和 long 的长度大小的? 回答 C++ 标准并没有规定它们的固定大小,只规定了下限。 sizeof(char) == 1 sizeof(char) <= sizeof(short) <= sizeof(int) <= sizeof(long) <= sizeof(long long) sizeof(signed char) == 1 sizeof(unsigned char) == 1 sizeof(short) >= 2 sizeof(int)
ClearSeve
2022/02/11
6450
零基础如何学好Python 之int 数字整型类型 定义int()范围大小转换
本文主题是讲python数字类型python int整型使用方法及技巧。它是不可变数据类型中的一种,它的一些性质和字符串是一样的,注意是整型不是整形哦。
小小科
2019/11/25
1.4K0
C# int int16 Int32 Int64的介绍[通俗易懂]
今天看到别人的代码中用到Int32,UInt32相关,想到自己平时用的都是int类型整数,就心生好奇的翻了一下资料:
全栈程序员站长
2022/09/21
3.6K0
.net Int16 、(int Int32)、 Int64 的区别
摘要: 关于什么是16位整数,32位整数,64位整数,请看这里:http://www.cnblogs.com/EasonJim/p/4837061.html Int16 值类型表示值介于 -32768 到 +32767 之间的有符号整数。
拓荒者
2019/03/14
2.7K0
小数转int类型_怎样对结构体进行大小端转换
static inline uint16_t bswap_16(uint16_t x) { return (x >> 8) | (x << 8); }
全栈程序员站长
2022/09/21
5570
int(*p)[4] int*p[4]
1、int(*p)[4];------p为指向含4个元素的一维整形数组的指针变量(是指针) #include <stdio.h> #include <stdlib.h> int main() { int a[4]={1,2,3,4}; int (*p)[4]; p=&a; printf("%d\n",(*p)[3]); printf("%d\n",*p); return 0; } 2、int *p[4];-------定义指针数组p,它由4个指向整型数据的
谙忆
2021/01/19
2K0
python中的int函数_python int()
Int8, 占1个字节. Int16, 占2个字节. Int32, 占4个字节. Int64, 占8个字节.
全栈程序员站长
2022/09/21
9270
一般试卷的纸张大小是多少_考试试卷用的是什么尺寸的纸
纸张的规格是指纸张制成后,经过636f70793231313335323631343130323136353331333365666136修整切边,裁成一定的尺寸。过去是以多少“开”(例如8开或16开等)来表示纸张的大小,如今我国采用国际标准,规定以A0、A1、A2、B1、B2……等标记来表示纸张的幅面规格。标准规定纸张的幅宽(以X表示)和长度(以Y表示)的比例关系为X:Y=1:n。
全栈程序员站长
2022/08/31
2.2K0
关于int *a[常量]与int (*a)[常量]的分析与区分(详解)
前言: 小伙伴私信我说,int *a[常量]与int (*a)[常量]这个区分不开,C指针,确实是C中最难的部分,也是学C++,JAVA,包括你以后上岗用的非常频繁的东西,在这里我就简单论述一下吧,具体关于指针的讲解见详文http://www.cnblogs.com/ECJTUACM-873284962/p/6682949.html 正文: 1.int *a[常量] 定义一个数组,该数组的每个成员都是int* 指针 2.int (*a)[常量] 定义一个指针, 该指针指向一个int数组! 令常量为n 对于i
Angel_Kitty
2018/04/08
1.2K0
int ** 的理解
int **p; int * p, 比较容易理解,就是定义一个指向int类型的指针。那么这里的int **p是什么呢? 对于这种特殊形式,首先可以确定的是p是一个指针,因为p前面不但有 * 号而且还有两个 * 号,所以肯定是指针。 那么两个 * 号又是什么意思呢? 把int **p分解为以下形式,和int *p比较,就会看的比较清楚
Twcat_tree
2022/11/30
3030
int ** 的理解
int和int32的区别_int float double char区别
Java中int就代表Int32 ,short就代表Int16,long就代表Int64
全栈程序员站长
2022/09/21
2K0
int和int32的区别_int float double char区别
MySQL的int (10) 和 int (11) 的区别
显示的宽度跟负号没有关系,它只在人工设置了 ZEROFILL 属性有效。一旦人工设置了 ZEROFILL 属性,MySQL 会自动设置 UNSIGNED 属性(即 ZEROFILL 不能存储负数)。
JavaEdge
2021/12/24
1.9K0
MySQL的int (10) 和 int (11) 的区别

相似问题

蛇的食物短缺

10

把路填好

10

把盖子拿来

10

把单子弄平

20

把权力相加

170
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

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

洞察 腾讯核心技术

剖析业界实践案例

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