Scala 2.13迁移Scala 3编译报错:E非合法路径问题
Scala 2.13迁移至Scala 3编译错误解决方法
错误原因
Scala 3对路径依赖类型的稳定性检查比Scala 2更严格。原代码中Environment的类型参数E <: Env属于不稳定路径,因此无法通过E#I、E#A的形式访问Env内部的类型成员,编译器抛出"E is not a legal path"错误。另外原代码中identityService方法的T类型参数未被实际使用,属于冗余代码。
修复方案
方案一:改用关联类型(Associated Types)
将Environment的泛型参数替换为关联类型,让E成为Environment自身的类型成员,这样E#I、E#A就属于合法的稳定路径:
trait Identity trait Authenticator trait Env { type I <: Identity type A <: Authenticator } trait IdentityService[T <: Identity] trait AuthenticatorService[T <: Authenticator] trait Environment { type E <: Env // 移除未使用的T类型参数 def identityService: IdentityService[E#I] def authenticatorService: AuthenticatorService[E#A] }
方案二:重构Env为泛型Trait
如果希望保留Environment的泛型参数形式,可以将Env的内部类型成员改为泛型参数,直接通过泛型传递类型约束:
trait Identity trait Authenticator // 将Env重构为泛型Trait,用参数替代内部类型成员 trait Env[I <: Identity, A <: Authenticator] trait IdentityService[T <: Identity] trait AuthenticatorService[T <: Authenticator] trait Environment[I <: Identity, A <: Authenticator, E <: Env[I, A]] { def identityService: IdentityService[I] def authenticatorService: AuthenticatorService[A] }
内容的提问来源于stack exchange,提问作者ndeverge
相关产品推荐
相关产品推荐

