GDD*_*GDD 7 types scala type-parameter
我无法理解为什么我得到"推断类型参数不符合类型参数边界".首先,我定义了一个名为CS的特征,它可以由几个类(例如,CS01和CS02)实现:
trait CS[+T <: CS[T]] {
this: T =>
def add: T
def remove: T
}
class CS01 extends CS[CS01] {
def add: CS01 = new CS01
def remove: CS01 = new CS01
}
class CS02 extends CS[CS02] {
def add: CS02 = new CS02
def remove: CS02 = new CS02
}
Run Code Online (Sandbox Code Playgroud)
这个想法是在呼叫时add或remove在CS01和CS02上保持实现的类型.其次,我想定义可以在每个符合特征CS的类上执行的操作.然后,我定义了一个叫做的特征Exec(有两个非常简单的类例子Exec01和Exec02混合Exec特征):
trait Exec {
def exec[U <: CS[U]](x: U): U
}
class Exec01 extends Exec {
def exec[U <: CS[U]](x: U): U = x.add
}
class Exec02 extends Exec {
def exec[U <: CS[U]](x: U): U = x.remove
}
Run Code Online (Sandbox Code Playgroud)
再次,我需要保持混合CS特征的类的实现类型.这就是exec参数化的原因[U <: CS[U]].
最后,我希望CS在它上面的任何启用操作混合特征Executable,这使得可以执行跟随特征的操作Exec:
trait Executable[T <: CS[T]] {
this: T =>
def execute(e: Exec): T = e.exec(this)
}
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试编译时,我收到以下错误:
error: inferred type arguments [this.Executable[T] with T] do not conform to method exec's type parameter bounds [U <: this.CS[U]]
def execute(e: Exec): T = e.exec(this)
^
Run Code Online (Sandbox Code Playgroud)
我不太明白,因为任何混合的类Executable必须是T由于绑定而具有混合CS特征的约束类型trait Executable[T <: CS[T]].那么,为什么this不符合绑定的类型参数U <: CS[U]呢?
如果您明确指定 exec 的类型参数,则有效:
def execute(e: Exec): T = e.exec[T](this)
Run Code Online (Sandbox Code Playgroud)
似乎是类型推断的限制。
| 归档时间: |
|
| 查看次数: |
5807 次 |
| 最近记录: |