加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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]

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读