加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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也没有收到;
>我不需要myMethod来了解A的具体类型;它需要知道的是A它是MyTrait的子类型,并且t2在A上被参数化;
> obj中的下划线是故意的;我称之为myMethod,我不知道A的具体类型(否则它不会成为问题);
>我更喜欢解决方案,我不需要修改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!

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读