gpt4 book ai didi

Scala - 路径相关类型的下限推断

转载 作者:行者123 更新时间:2023-12-04 20:10:27 24 4
gpt4 key购买 nike

我试图理解为什么 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 的子类以外的任何东西,因为边界是正确的 AMyTrait2 .如果有,你能给我一个例子或指出这个代码片段的错误之处吗?

如果这是 Scala 编译器的限制,谁能告诉我一种使用类型系统实现此目的的方法?注意:
  • 我没有 MyTrait对象,也不是 myMethod收到一份;
  • 我不需要myMethod了解A的具体类型;它只需要知道 A它是 MyTrait 的子类型还有那个t2A 上参数化;
  • 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!

    关于Scala - 路径相关类型的下限推断,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18102617/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com