【问题标题】:General-purpose method that returns a union type返回联合类型的通用方法
【发布时间】:2020-10-03 13:37:27
【问题描述】:

我有一个来自Union type Scala 的联合类型 Int 和 String,我想将它添加到通用方法中。你能帮我写这个方法,没有编译错误。

object OrTypeMain extends App {

  class StringOrInt[T]
  object StringOrInt {
    implicit object IntWitness    extends StringOrInt[Int]
    implicit object StringWitness extends StringOrInt[String]
  }

  object Bar {
    def foo[T: StringOrInt](x: T): Unit = x match {
      case _: String => println("str")
      case _: Int => println("int")
    }

    // target method
    def reverse[T: StringOrInt](x: T): StringOrInt = x match { // not compile
    def reverse[T: StringOrInt](x: T): T = x match { // not compile too

      case x: String => x + "new"
      case y: Int => y + 5
    }
  }

  Bar.reverse(123)
  Bar.reverse("sad")
}

【问题讨论】:

    标签: scala pattern-matching typeclass implicit union-types


    【解决方案1】:

    这里解释了为什么reverse 无法编译:

    Why can't I return a concrete subtype of A if a generic subtype of A is declared as return parameter?

    Type mismatch on abstract type used in pattern matching

    用编译时类型类替换运行时模式匹配。 StringOrInt 已经是一个类型类。只需将您的操作移到那里即可。

    trait StringOrInt[T] {
      def reverse(t: T): T
    }    
    object StringOrInt {
      implicit object IntWitness extends StringOrInt[Int] {
        override def reverse(t: Int): Int = t + 5
      }
    
      implicit object StringWitness extends StringOrInt[String] {
        override def reverse(t: String): String = t + "new"
      }  
    }
    
    def reverse[T: StringOrInt](x: T): T = implicitly[StringOrInt[T]].reverse(x)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-02-23
      • 1970-01-01
      • 1970-01-01
      • 2018-12-20
      • 2022-12-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多