【问题标题】:Compile error when adding List as parameter添加列表作为参数时编译错误
【发布时间】:2014-10-13 13:36:16
【问题描述】:

这段代码:

package neuralnetwork

object hopfield {
  println("Welcome to the Scala worksheet")

  object Neuron {
    def apply() = new Neuron(0, 0, false, Nil, "")
    def apply(l : List[Neuron]) = new Neuron(0, 0, false, l, "")
  }

  case class Neuron(w: Double, tH: Double, var fired: Boolean, in: List[Neuron], id: String)

  val n2 = Neuron
  val n3 = Neuron
  val n4 = Neuron
  val l = List(n2,n3,n4)
  val n1 = Neuron(l)



}

导致编译错误:

type mismatch; found : List[neuralnetwork.hopfield.Neuron.type] required: List[neuralnetwork.hopfield.Neuron]

在线:val n1 = Neuron(l)

为什么会发生这种情况?阻止添加列表的实现有什么不正确的地方?

【问题讨论】:

    标签: scala


    【解决方案1】:

    您传入的类型,n2n3n4 的类型为 Neuron.type,尝试添加括号:

    val n2 = Neuron()
    val n3 = Neuron()
    val n4 = Neuron()
    val l = List(n2,n3,n4)
    val n1 = Neuron(l)
    

    不同之处在于,通过括号,您实际上得到了一个Neuron 类(您调用apply 方法),类型将是Neuron 而不是Neuron.type

    编辑:

    .type 表示法称为单例类型,它仅表示类所表示的对象,在这种情况下,Neuron.type 仅返回该单例对象,更多信息在 this paper by Odersky about the scala overview 中第 9 页。

    【讨论】:

    • 是的,否则按照 Gabriele 的说法手动调用 apply(我更喜欢括号)。
    • 其实我也更喜欢括号。值得一提的是,由于apply不带参数,所以编译器在看到Neuron时需要在Neuron.applyNeuron之间进行选择,并且总是选择后者,否则你就没有办法了指Neuron的类型。
    • @Ende Neu 是 .type 方法吗?我似乎在 Scala API 中找不到它的用途?
    • @blue-sky 实际上不是,但周围没有太多,我能找到的最好的是this post
    • @blue-sky 我发现了一些关于 .type 表示法的内容,并对我的答案进行了编辑,可以在该论文中找到更详细的内容(如果你只对单例类型表示法感兴趣)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-14
    • 1970-01-01
    • 2011-04-11
    相关资源
    最近更新 更多