类型从隐式类中删除

问题描述 投票:1回答:1

例如,我有一个隐式类为案例类添加某些功能:

case class TestClass(name:String)

implicit class ChangeProduct[S <: Seq[T], T <: Product](seq: Option[Seq[T]]) {
    def convert(expr: T => T): Option[Seq[T]] = seq.map(_.map(expr))
}

val c = Option(List(TestClass("a"), TestClass("b")))
val r = c.convert(p => p.copy(name = p.name.toUpperCase()))
println(r)

我很高兴看到输出为

Some(List(TestClass(A), TestClass(B)))

但是现在我通过将其参数更改为seq:Option[S]来使隐式类更通用。

implicit class ChangeProduct[S <: Seq[T], T <: Product](seq: Option[S]) {
    def convert(expr: T => T): Option[S] = seq.map(_.map(expr))
}

val c = Option(List(TestClass("a"), TestClass("b")))
val r = c.convert(p => p.copy(name = p.name.toUpperCase()))
println(r)

不幸的是我收到错误消息:

Error:(37, 51) type mismatch;
   found   : Seq[T]
   required: S
        def convert(expr: T => T): Option[S] = seq.map(_.map(expr))

对于表达式p.copy(name = p.name.toUpperCase()),它说

Type mismatch.
    Required: Nothing => Nothing
    Found : Nothing => Any

我认为这可能是类型擦除问题,但我不知道如何解决。

scala implicit type-erasure classtag
1个回答
0
投票

与类型擦除无关。问题是,仅因为您将类型参数S限制为Seq的子类,opt不会自动成为Option[Seq[T]]的子类,因此您无法映射包含在您的数据中的数据Option

由于Option数据类型的类型参数已经是协变的,所以一种可能的解决方案可能是更改隐式类的类型参数:

© www.soinside.com 2019 - 2024. All rights reserved.