Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 返回联合类型的通用方法_Scala_Pattern Matching_Typeclass_Implicit_Union Types - Fatal编程技术网

Scala 返回联合类型的通用方法

Scala 返回联合类型的通用方法,scala,pattern-matching,typeclass,implicit,union-types,Scala,Pattern Matching,Typeclass,Implicit,Union Types,我有一个union类型Int和String from,我想把它添加到通用方法中。你能帮我写这个方法吗,没有编译错误 object OrTypeMain extends App { class StringOrInt[T] object StringOrInt { implicit object IntWitness extends StringOrInt[Int] implicit object StringWitness extends StringOrInt[

我有一个union类型Int和String from,我想把它添加到通用方法中。你能帮我写这个方法吗,没有编译错误

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")
}
此处解释了为什么reverse不编译:

用编译时类型类替换运行时模式匹配。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)