Scala 2.13.x中如何通过模式匹配推导类型成员?
解决Scala 2.13中模式匹配下关联类型的类型推导问题
你的问题核心是Scala编译器在模式匹配分支中没有自动细化e的具体类型,导致无法将e.Param与Int关联起来。要让代码生效,需要显式告知编译器分支中e的具体类型,以下是可行的解决方案:
方案1:显式指定分支变量的单例类型
在模式匹配时,通过类型归属明确变量的单例类型,让编译器识别出当前Param的具体类型:
def get(e: MyEnum): MyTypeClass[e.Param] = e match { case _: MyEnum.Value1.type => i }
这里通过: MyEnum.Value1.type标注,编译器能确定此时e的类型是MyEnum.Value1.type,其Param类型就是Int,因此i: MyTypeClass[Int]可以匹配返回类型MyTypeClass[e.Param]。
方案2:绑定变量并利用类型推导
也可以绑定变量后依赖编译器自动细化类型,写法更直观:
def get(e: MyEnum): MyTypeClass[e.Param] = e match { case v @ MyEnum.Value1 => i }
绑定变量v后,编译器会根据匹配的单例对象自动将v的类型细化为MyEnum.Value1.type,进而确认v.Param就是Int,类型匹配自然通过。
原代码报错原因
原代码中case MyEnum.Value1仅匹配了单例对象的值,但Scala 2.13默认不会自动将e的类型细化为MyEnum.Value1.type,因此e.Param仍为抽象类型,无法与Int兼容,导致类型不匹配的编译错误。显式标注或绑定变量触发类型细化后,编译器才能正确关联Param的具体类型。
内容的提问来源于stack exchange,提问作者Krever
相关产品推荐
相关产品推荐

