【问题标题】:What is A* for method parameter?方法参数的 A* 是什么?
【发布时间】:2014-12-27 13:46:23
【问题描述】:

在下面的应用方法中,什么是“as: A*”?

List(1, 2, 3) 构造一个类型列表:Cons(1,Cons(2,Cons(3,Nil)))

通过阅读方法代码,它似乎是一种语法糖 多个相同类型的类型参数?

  sealed trait List[+A]
  case object Nil extends List[Nothing]

  case class Cons[+A](head: A, tail: List[A]) extends List[A]
object List {
    def apply[A](as: A*): List[A] =
      if (as.isEmpty) Nil
      else {
        Cons(as.head, apply(as.tail: _*))
      }
  }

如果这是真的,这不应该也是有效的:

object List {
    def apply[A](asHead: A , asTail : A): List[A] =
      if (asHead.isEmpty) Nil
      else {
        Cons(asHead.head, apply(asTail.tail: _*))
      }

【问题讨论】:

标签: scala


【解决方案1】:

不,这里有区别。

当你声明 asHead: A, asTail: A 时,asHeadasTail 显然具有相同的类型。但是,在使用as: A*的原始代码中,as.head的类型是Aas.tail的类型是Seq[A]——可以从head和@987654330的类型推导出来@。因此,你的代码不是一回事。

声明A* 代表“A 类型参数的可变数量”,通常称为vararg。这与Seq[A]相似,但调用不同:

apply(1, 2, 3) // A*
apply(Seq(1, 2, 3)) // Seq[A]

与之对应的是: _* 声明,当调用带有序列的可变参数方法时:

apply(Seq(1, 2, 3): _*) // A*
apply(Seq(1, 2, 3)) // Seq[A]

【讨论】:

  • 那么它会被翻译成 JVM 可变参数(... 在 Java 中)吗?
  • @Daniel C. Sobral “声明 A* 代表“类型 A 的可变数量的参数””,这是否意味着类型 A 和类型 Seq[A] 是同一类型?
  • @Daniel C. Sobral List 是一个自定义实现,我更新了问题
  • @blue-sky ASeq[A] 不是一回事。我不确定List 作为自定义实现有什么意义。
  • @DanielC.Sobral 这是取自“Scala 函数式编程”一书中的人为示例
猜你喜欢
  • 2021-02-20
  • 1970-01-01
  • 1970-01-01
  • 2018-02-01
  • 2012-10-31
  • 2017-06-24
  • 2012-10-29
  • 1970-01-01
  • 2016-03-20
相关资源
最近更新 更多