【问题标题】:Existential type or type parameter bound failure存在类型或类型参数绑定失败
【发布时间】:2014-01-07 21:51:14
【问题描述】:

我有一个 F 有界类型Sys

trait Sys[S <: Sys[S]]

还有一些将其作为类型参数的特征:

trait Foo[S <: Sys[S]]

假设我有一个使用Foo 调用的方法:

def invoke[S <: Sys[S]](foo: Foo[S]) = ()

假设我有一个模型更新类型和一个带有Foo 的子类型:

sealed trait Update
case class Opened[S <: Sys[S]](foo: Foo[S]) extends Update

注册模型观察者的辅助函数:

def observe(pf: PartialFunction[Update, Unit]) = ()

现在以下失败了:

observe {
  case Opened(foo) => invoke(foo)
}

<console>:16: error: inferred type arguments [Any] do not conform to method invoke's
                     type parameter bounds [S <: Sys[S]]
                case Opened(foo) => invoke(foo)
                                    ^

如何修复部分函数,如果给出了SysFooinvokeUpdateOpenedobserve。允许向Foo 添加值或类型成员。

【问题讨论】:

    标签: scala pattern-matching existential-type type-bounds bounded-quantification


    【解决方案1】:

    如何将 Foo 特征的类型参数移动到类型变量:

    trait Sys[S <: Sys[S]]
    trait Foo { type S <: Sys[S] }
    
    sealed trait Update
    case class Opened(foo: Foo) extends Update
    
    def invoke(foo: Foo) = ()
    def observe(pf: PartialFunction[Update, Unit]) = ()
    
    observe {
      case Opened(foo) => invoke(foo)
    }
    

    更新:

    你完全正确。对于所有新类型替换,您需要为将类型参数移动到正文定义别名。

    类型别名示例:

    trait Sys[S <: Sys[S]]
    class A extends Sys[A]
    class B extends Sys[B]
    
    trait Foo { type S <: Sys[S] }
    trait Boo { type S <: Sys[S] } 
    
    object module_A{
      type Foo = com.company.Foo { type S <: A }
      type Boo = com.company.Boo { type S <: A }
    }
    
    def invoke(foo: module_A.Foo, boo: module_A.Boo) = ()          
    

    【讨论】:

    • 问题是这立即变得令人厌烦,我的整个 API 都是基于类型构造函数参数。你很快就会有def foo[S1 &lt;: Sys[S1]](bar: Bar { type S = S1 }, baz: Baz { type S = S1 }): Gaga { type S = S1 } 等。
    【解决方案2】:

    一个可能的解决方案是强制转换:

    observe {
      case Opened(foo) => invoke(foo.asInstanceOf[Foo[~] forSome { type ~ <: Sys[~] }])
    }
    

    显然这太可怕了,不是首选的解决方案,所以我正在等待其他答案。

    【讨论】:

      猜你喜欢
      • 2023-02-22
      • 1970-01-01
      • 1970-01-01
      • 2011-05-06
      • 2018-12-13
      • 1970-01-01
      • 2012-01-01
      • 1970-01-01
      • 2013-07-03
      相关资源
      最近更新 更多