为何InetAddress的switch模式匹配提示未覆盖所有输入值?
为什么密封类InetAddress的switch模式匹配仍提示未覆盖所有情况?
这不是Java的Bug,问题出在JDK内部存在InetAddress的非公开子类。
虽然InetAddress作为密封类,在permits列表里只声明了Inet4Address和Inet6Address,但根据Java密封类的规则:和密封类处于同一模块、同一包下的子类,哪怕不在permits列表里,也能合法继承密封类。
JDK在java.net包(和InetAddress同包同模块)里有个私有静态内部子类InetAddressHolder,用来处理未解析地址这类特殊场景。编译器能识别到这个内部子类的存在,所以会判定你的switch分支没覆盖所有可能的输入,进而抛出编译错误。
解决办法有两种:
- 加个
default分支,兜底处理所有未匹配的情况(包括这个内部子类和null):switch (addr) { case Inet4Address a -> ...; case Inet6Address a -> ...; default -> ...; // 处理InetAddressHolder或其他特殊情况 }; - 显式匹配
InetAddress本身(InetAddressHolder作为子类会被这个分支捕获):switch (addr) { case Inet4Address a -> ...; case Inet6Address a -> ...; case InetAddress other -> ...; };
如果addr有可能为null,记得额外加case null分支,否则null会直接触发NullPointerException:
switch (addr) { case null -> ...; case Inet4Address a -> ...; case Inet6Address a -> ...; case InetAddress other -> ...; };
内容的提问来源于stack exchange,提问作者Aleksandr Dubinsky
相关产品推荐
相关产品推荐

