scala – 具有类型参数的case类的Tupled方法
发布时间:2020-12-16 19:20:59 所属栏目:安全 来源:网络整理
导读:当有一个带有类型参数的case类时,我看不到如何调用tupled方法.它似乎与申请和不适用相关. scala case class Foo[T](x:T,y:T)defined class Fooscala Foo.apply[Int] _res1: (Int,Int) = Foo[Int] = function2scala Foo.unapply[Int] _res2: Foo[Int] = Optio
当有一个带有类型参数的case类时,我看不到如何调用tupled方法.它似乎与申请和不适用相关.
scala> case class Foo[T](x:T,y:T) defined class Foo scala> Foo.apply[Int] _ res1: (Int,Int) => Foo[Int] = <function2> scala> Foo.unapply[Int] _ res2: Foo[Int] => Option[(Int,Int)] = <function1> scala> Foo.tupled[Int] _ <console>:10: error: value tupled is not a member of object Foo Foo.tupled[Int] _ ^ 对于发生了什么有什么想法? 解决方法
TL;博士
案例类的伴随对象在具有类型参数时不能扩展FunctionN(定义tupled,其中N> = 2).使用 (Foo[Int] _).tupled 讨论 当你有一个香草类如 case class Bar(x: Int,y: Int) 它的构造函数实际上是一个Function2 [Int,Int,Bar],因此当编译器生成伴随对象Bar时,它可以方便地扩展Function2. 然后生成的代码将是 class Bar extends AnyRef with Product with Serializable { ... } object Bar extends Function2[Int,Bar] with Serializable { ... } 现在考虑 case class Foo[T](x: T,y: T) 如果你尝试应用同样的技巧,你很快就会遇到麻烦: // this can't compile,what's T? object Foo extends Function2[T,T,Bar] with Serializable { ... } 由于T是未知的,编译器不能使Foo成为Function2的子类,并且它不能比使它扩展AnyRef好得多: class Foo[T] extends AnyRef with Product with Serializable { ... } object Foo extends AnyRef with Serializable { ... } 这里是上面讨论的内容的快速证明(使用scala -Xprint:typer): scala> case class Bar(x: Int,y: Int) ... <synthetic> object Bar extends scala.runtime.AbstractFunction2[Int,Bar] with Serializable { ... scala> case class Foo[T](x: T,y: T) ... <synthetic> object Foo extends AnyRef with Serializable { ... 要包装它,当你有类型参数时,你必须首先获得一个Function2 val f: Function2[Int,Foo] = Foo[Int] _ 然后你可以打电话给它 f.tupled // ((Int,Int)) => Foo[Int] (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |