Java 17中使用switch匹配Record时出现编译错误求助
问题分析与解决思路
核心原因
编译错误的根源是密封接口DomainFailure.DomainError的permits列表与实际实现类的归属路径不匹配,导致编译器无法识别switch中的类型模式语法,进而报错。
具体问题点
你定义的两个Record类是直接实现DomainFailure.DomainError的独立类(或非DomainReferenceFailure的内部类),但密封接口的permits却指定了DomainReferenceFailure.xxx的路径,两者不对应。这种情况下,编译器不认为这两个Record是密封接口的合法实现类,因此switch中case 类型 e -> ...的类型模式语法会被判定为非法。
解决步骤
步骤1:修正密封接口的permits列表
根据Record类的实际定义位置调整permits:
- 如果两个
Record是顶级类(不属于任何内部类),修改密封接口:
public sealed static interface DomainError permits InvalidReferenceUniqueIdentifierError, InvalidReferenceTransactionIdError { }
- 如果两个
Record是**DomainReferenceFailure的内部类**,需要将Record定义嵌套到DomainReferenceFailure类中:
public class DomainReferenceFailure { public record InvalidReferenceUniqueIdentifierError(ReferenceUniqueIdentifier referenceUniqueIdentifier) implements DomainFailure.DomainError { } public record InvalidReferenceTransactionIdError(TransactionId transactionId) implements DomainFailure.DomainError { } }
此时原密封接口的permits路径是正确的,无需修改。
步骤2:验证实现类的正确性
确保两个Record类正确实现了DomainFailure.DomainError接口,类名、接口名无拼写错误。
步骤3:确认编译环境
检查项目编译级别是否设置为Java 17,避免因版本过低导致语法不支持(Java 17中switch类型模式为正式特性,无需启用预览)。
修正后的示例代码
假设Record为顶级类,完整代码如下:
// 密封接口 public sealed static interface DomainError permits InvalidReferenceUniqueIdentifierError, InvalidReferenceTransactionIdError { } // Record实现类 public record InvalidReferenceUniqueIdentifierError(ReferenceUniqueIdentifier referenceUniqueIdentifier) implements DomainFailure.DomainError { } public record InvalidReferenceTransactionIdError(TransactionId transactionId) implements DomainFailure.DomainError { } // 使用switch的代码 DomainFailure.DomainError cause = new InvalidReferenceTransactionIdError(TransactionId.of(UUID.randomUUID().toString())); String message = switch (cause) { case InvalidReferenceUniqueIdentifierError e -> e.referenceUniqueIdentifier().toString(); case InvalidReferenceTransactionIdError e -> e.transactionId().toString(); };
内容的提问来源于stack exchange,提问作者Jordi
相关产品推荐
相关产品推荐

