Scala 我可以吗;“拉皮条我的图书馆”;在方法返回此.type的参数化特征上?

Scala 我可以吗;“拉皮条我的图书馆”;在方法返回此.type的参数化特征上?,scala,implicit-conversion,builder,implicit,extending,Scala,Implicit Conversion,Builder,Implicit,Extending,我想用返回this.type的方法扩展我的参数化trait字段[T],使用Pimp-my-Library模式。但我还是遇到了编译器错误。我尝试了一些变体,但没有成功 我做错了吗?还是要求做不可能的事 下面是我的测试示例: trait Field[T] class IntField extends Field[Int] { def getInt = 5 } // Variant 1: return field.type object Var1 { implicit class Rich

我想用返回this.type的方法扩展我的参数化trait
字段[T]
,使用Pimp-my-Library模式。但我还是遇到了编译器错误。我尝试了一些变体,但没有成功

我做错了吗?还是要求做不可能的事

下面是我的测试示例:

trait Field[T]

class IntField extends Field[Int] {
  def getInt = 5
}

// Variant 1: return field.type
object Var1 {
  implicit class RichField[T](val field: Field[T]) {
    def bar(fn: T => String): field.type = {
      // some actions using T
      field
    }
  }

  new IntField().bar(_.toString).getInt  // Error: value getInt is not a member of Field[Int]
}

// Variant 2: use two type parameters
object Var2 {
  implicit class RichField[T, F <: Field[T]](val field: F) {
    def bar(fn: T => String): F = {
      // some actions using T
      field
    }
  }

  new IntField().bar(_.toString).getInt // <-- Error: value bar is not a member of IntField
}

// Variant 3: use higher kinds
object Var3 {
  import scala.language.higherKinds

  implicit class RichField[F[X] <: Field[X], T](val field: F[T]) {
    def bar(fn: T => String): F[T] = {
      // some actions using T
      field
    }
  }

  new IntField().bar(_.toString).getInt // <-- Error: value getInt is not a member of Field[Int]
}
trait字段[T]
类IntField扩展字段[Int]{
def getInt=5
}
//变量1:返回字段.type
对象变量1{
隐式类RichField[T](值字段:字段[T]){
定义栏(fn:T=>String):field.type={
//使用T的一些操作
领域
}
}
new IntField().bar(u.toString).getInt//错误:值getInt不是字段[Int]的成员
}
//变量2:使用两个类型参数
对象变量2{
隐式类RichField[T,F字符串):F={
//使用T的一些操作
领域
}
}

在变体2中,您没有在任何地方使用
T
。只需将其删除,编译器就不会再感到困惑:

implicit class RichField[F <: Field[_]](val field: F) {
  def bar: F = field
}
这里有一个证明,它可以按预期工作(在您的示例中使用
toString
不是一个好的测试,因为
toString
在每个类上都可用,所以即使编译器推断出
任何
代码也会编译):


很抱歉,这个例子过于简单(我刚刚更新了)。但是我需要
T
在方法
bar
中。无论如何,谢谢你的帮助。哇,很好的黑客!工作完美。我真的很感谢你的帮助。
implicit class RichField[T, F <: Field[_]](val field: F with Field[T]) {
  def bar(fn: T => String): F = {
    // some actions using T
    field
  }
}
scala> case class Foo(name: String)
defined class Foo

scala> class FooField extends Field[Foo] {
     |   def getInt = 5
     | }
defined class FooField

scala> new FooField().bar(_.name).getInt
res8: Int = 5