Scala 如何定义部分参数化泛型隐式类?

Scala 如何定义部分参数化泛型隐式类?,scala,implicit-conversion,Scala,Implicit Conversion,是否可以定义部分参数化泛型隐式类?例如,假设我有下面的类 implicit class IoExt[L, R](val io: IO[R]) { def wrapped(errorCode: String): IO[Either[ProcessingResult[L], R]] = ??? } 我如何定义这样的东西 type IoExtLocal[R] = IoExt[String, R] IoExtLocal[R]是否可以作为隐式类使用 这样做的目的是使客户机代码不必在每次

是否可以定义部分参数化泛型隐式类?例如,假设我有下面的类

  implicit class IoExt[L, R](val io: IO[R]) {
    def wrapped(errorCode: String): IO[Either[ProcessingResult[L], R]] = ???
  }
我如何定义这样的东西

type IoExtLocal[R] = IoExt[String, R]
IoExtLocal[R]是否可以作为隐式类使用


这样做的目的是使客户机代码不必在每次包装[]时都指定类型参数。。被称为。它变得非常冗长。

只需创建另一个隐式类并导入必要的类

  object ioExt {
    implicit class IoExt[L, R](val io: IO[R]) extends AnyVal {
      def wrapped(errorCode: String): IO[Either[ProcessingResult[L], R]] = ???
    }
  }

  object ioExtLocal { 
    implicit class IoExtLocal[R](val io: IO[R]) extends AnyVal {
      def wrapped(errorCode: String): IO[Either[ProcessingResult[String], R]] = 
        (io: ioExt.IoExt[String, R]).wrapped(errorCode)
    }
  }

  import ioExtLocal._

  trait SomeR
  val x: IO[SomeR] = ???
  x.wrapped(???)

只需创建另一个隐式类并导入必要的类

  object ioExt {
    implicit class IoExt[L, R](val io: IO[R]) extends AnyVal {
      def wrapped(errorCode: String): IO[Either[ProcessingResult[L], R]] = ???
    }
  }

  object ioExtLocal { 
    implicit class IoExtLocal[R](val io: IO[R]) extends AnyVal {
      def wrapped(errorCode: String): IO[Either[ProcessingResult[String], R]] = 
        (io: ioExt.IoExt[String, R]).wrapped(errorCode)
    }
  }

  import ioExtLocal._

  trait SomeR
  val x: IO[SomeR] = ???
  x.wrapped(???)

在尝试了多个解决方案之后,我发现以下方法在每次调用wrapped时都不需要实例化helper类

另一方面,下面的代码在每次调用时都实例化helper类

implicit class IoExtLocalString[R](protected val io: IO[R]) extends AnyVal with IoExtTrait[String, R] {}
如果有人知道为什么会这样,请告诉我。我在Scala 2.12.8上,与2.13-RC1的行为相同


在的进一步对话证实,这两种情况下都会发生分配。太糟糕了。

在尝试了多个解决方案后,我发现下面的方法在每次调用wrapped时都不会实例化helper类

另一方面,下面的代码在每次调用时都实例化helper类

implicit class IoExtLocalString[R](protected val io: IO[R]) extends AnyVal with IoExtTrait[String, R] {}
如果有人知道为什么会这样,请告诉我。我在Scala 2.12.8上,与2.13-RC1的行为相同


在的进一步对话证实,这两种情况下都会发生分配。太糟糕了。

谢谢@dmytro mitin!在您的解决方案中,wrapped的每次调用都会实例化新对象。编译器还为每个类型生成两个包装器类。你能为这两个缺点提出解决方案吗?谢谢。我也得到了同样的结果。无论如何我都会接受你的回答。您能分享一下您的想法吗?为什么Scala编译器在我的答案中的示例中不生成值类调用?谢谢@dmytro-mitin!在您的解决方案中,wrapped的每次调用都会实例化新对象。编译器还为每个类型生成两个包装器类。你能为这两个缺点提出解决方案吗?谢谢。我也得到了同样的结果。无论如何我都会接受你的回答。您能分享一下您的想法吗?在我的回答中,Scala编译器为什么不在示例中生成值类调用?通用特性允许对值类的方法进行基本继承,但它们会产生分配开销@dmytro mitin但是为什么添加重写函数却不能解决这个问题呢?通用特性允许对值类的方法进行基本继承,但是它们会产生分配开销@dmytro mitin但是为什么添加覆盖函数却什么都不做呢?