Scala – 路径依赖类型的下界推断
发布时间:2020-12-16 18:38:34 所属栏目:安全 来源:网络整理
导读:我试图理解为什么 Scala编译器不能推断出对路径依赖类型的以下限制: trait MyTraitclass MyTraitImpl extends MyTraittrait MyTrait2[A : MyTrait] { type MyTraitType = A}class MyTrait2Impl[A : MyTrait] extends MyTrait2[A]val obj: MyTrait2[_] = new
我试图理解为什么
Scala编译器不能推断出对路径依赖类型的以下限制:
trait MyTrait class MyTraitImpl extends MyTrait trait MyTrait2[A <: MyTrait] { type MyTraitType = A } class MyTrait2Impl[A <: MyTrait] extends MyTrait2[A] val obj: MyTrait2[_] = new MyTrait2Impl[MyTraitImpl] def myMethod[A <: MyTrait](t2: MyTrait2[A]) = println("Hi!") myMethod[obj.MyTraitType](obj) // <console>:14: error: type arguments [obj.MyTraitType] do not conform to method myMethod's type parameter bounds [A <: MyTrait] // myMethod[obj.MyTraitType](obj) 对我来说,直观地说,MyTraitType不能是MyTrait的子类以外的任何东西,因为绑定在MyTrait2中的A上是正确的.如果有,你能给我一个例子或指出我这个代码片段错误的地方吗? 如果这是Scala编译器限制,有人能告诉我使用类型系统实现这一目的吗?注意: >我没有MyTrait对象,myMethod也没有收到; 解决方法
您应该只在类型成员上使用约束而不是在MyTrait2声明中的类型参数上使用约束:
trait MyTrait class MyTraitImpl extends MyTrait trait MyTrait2 { // Remove [A <: MyTrait] type MyTraitType <: MyTrait // add <: MyTrait } class MyTrait2Impl[A <: MyTrait] extends MyTrait2 { type MyTraitType = A } val obj: MyTrait2 = new MyTrait2Impl[MyTraitImpl] def myMethod[A <: MyTrait](t2: MyTrait2{ type MyTraitType = A }) = println("Hi!") myMethod[obj.MyTraitType](obj) 正如预期的那样,您将在错误的类型上收到编译错误: scala> val otherObj: MyTrait2 = new MyTrait2Impl[MyTraitImpl] otherObj: MyTrait2 = MyTrait2Impl@8afcd0c scala> myMethod[obj.MyTraitType](otherObj) <console>:15: error: type mismatch; found : otherObj.type (with underlying type MyTrait2) required: MyTrait2{type MyTraitType = obj.MyTraitType} myMethod[obj.MyTraitType](otherObj) ^ 证明它适用于List [MyTrait2]: scala> for { | obj <- List[MyTrait2]( | new MyTrait2Impl[MyTraitImpl],| new MyTrait2Impl[MyTraitImpl] | ) | } myMethod[obj.MyTraitType](obj) Hi! Hi! (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
推荐文章
站长推荐
热点阅读