让我们拥有一个类型类,该类型类根据类型定义了更多可以使用的类型:
trait Container[T] {
type Elem
def get(c: T, i: Int): Elem
def set(c: String, i: Int, v: Elem): T
}
implicit object StringContainer extends Container[String] {
type Elem = Char
def get(c: String, i: Int) = c(i)
def set(c: String, i: Int, v: Char) = c.patch(i, Seq(v), 1)
}
val ops = implicitly[Container[String]]
ops.set("ABC", 1, ops.get("ABC", 1)) // works
ops.set("ABC", 1, 'X') // type mismatch; found : Char('X') required: ops.Elem
由于类型取决于路径,因此编译器在尝试使用此类型时会抱怨,因此错误是:
类型不匹配;
找到:Char('X')
必填:ops.Elem
你我知道ops.Elem
是Char
。我当前的解决方法是改为Elem
用作类型参数:
trait Container[T, Elem] {
def get(c: T, i: Int): Elem
def set(c: String, i: Int, v: Elem): T
}
implicit object StringContainer extends Container[String, Char] {
def get(c: String, i: Int) = c(i)
def set(c: String, i: Int, v: Char) = c.patch(i, Seq(v), 1)
}
缺点是需要时调用类型类,需要提供所有类型参数:
val ops = implicitly[Container[String, Char]]
是否有某种方法可以在类型类中定义类型,以便可以将它们用作与路径无关的类型?
你只是要求
Container[String]
代替
Container[String] { type Elem = Char }
尝试类型细化
object Container {
implicit val strContainer: Container[String] { type Elem = Char } = new Container[String] {
type Elem = Char
def get(c: String, i: Int) = c(i)
def set(c: String, i: Int, v: Char) = c.patch(i, Seq(v), 1)
}
}
val ops = implicitly[Container[String] { type Elem = Char }]
ops.set("ABC", 1, 'X') // ok
带有辅助模式的像
object Container {
type Aux[T,Elem0] = Container[T] { type Elem = Elem0 }
implicit val strContainer: Aux[String, Char] = new Container[String] {
type Elem = Char
def get(c: String, i: Int) = c(i)
def set(c: String, i: Int, v: Char) = c.patch(i, Seq(v), 1)
}
}
val ops = implicitly[Container.Aux[String,Char]]
ops.set("ABC", 1, 'X') // ok
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句