【问题标题】:Scala: value next is not a member of T compilation errorScala:值 next 不是 T 编译错误的成员
【发布时间】:2015-11-27 15:46:09
【问题描述】:

有代码:

class DoubleLinkedQueue[T] {
    class DoubleLinkedQueueNode[T](value: T) {
        var next : DoubleLinkedQueueNode[T]
        var prev : DoubleLinkedQueueNode[T]
    }

    var head = new DoubleLinkedQueueNode[T](_)
    var tail = new DoubleLinkedQueueNode[T](_)
    head.next = tail //compillation error here

    def isEmpty() : Boolean = {
        return head.next == tail //and here
    }

    def peekStart() : T = {
        return head.next.value //and here too
    }

    def popStart() : T = {
        val result = peekStart()
        head.next = head.next.next //and everywhere when trying to acces head or tail properties
        return result
    }

    def peekEnd() : T = {
        return tail.prev.value
    }

    def popEnd() : T = {
        val result = peekEnd()
        tail.prev = tail.prev.prev
        return result
    }

    def pushStart(value : T) : DoubleLinkedQueue[T] = {
        val node = new DoubleLinkedQueueNode[T](value)
        node.next = head.next
        node.prev = head
        head.next = node
        return this
    }

    def pushEnd(value : T) : DoubleLinkedQueue[T] = {
        val node = new DoubleLinkedQueueNode[T](value)
        node.prev = tail.prev
        node.next = tail
        tail.prev = node
        return this
    }
}

并且出现编译错误:

DoubleLinkedQueue.scala:9: 错误:值 next 不是 T => DoubleLinkedQueue.this.DoubleLinkedQueueNode[T] 的成员 head.next = 尾

有人知道怎么解决吗?

UPD1here描述的问题一样吗?

【问题讨论】:

  • var head = new DoubleLinkedQueueNode[T](_) 中,head 的类型为 T=>DoubleLinkedQueueNode。 new DoubleLinkedQueueNode[T](_),是一个部分应用的函数。
  • 那么如何使它成为 DoubleLinkedQueueNode 的类型并让 DoubleLinkedQueueNode 仍然是通用的?

标签: scala


【解决方案1】:

您可以使 DoubleLinkedQueueNode 的值可变:

class DoubleLinkedQueueNode[T] {
  var next : DoubleLinkedQueueNode[T] = _
  var prev : DoubleLinkedQueueNode[T] = _
  var value: T = _
}

所以你不需要初始化它:

 var head = new DoubleLinkedQueueNode[T](_)

相反,您将拥有:

 var head = new DoubleLinkedQueueNode[T]

【讨论】:

  • 嗯...我可以试试。但它看起来有点半解决方案。
【解决方案2】:

看来,一个好的解决方案是在 DoubleLinkedQueueNode 中使用 Option 作为 'val' 类型。

【讨论】:

    【解决方案3】:

    如果您决定创建一个 DoubleLinkedQueueNode 的实例,您必须给它一个 T 类型的正确值,而不是 _。

    在编写以下内容时:

    var head = new DoubleLinkedQueueNode[T](_)
    

    您实际上创建了以下函数:

    T => DoubleLinkedQueueNode[T] = <function1>
    

    所以基本上和写作一样:

    var func = new DoubleLinkedQueueNode[T](_)
    var head = func(someValueOfTypeT)
    

    顺便说一句,我在代码中发现了其他问题,例如:

    第二条命令可以擦除:

    var head = new DoubleLinkedQueueNode[T](_)
    var tail = new DoubleLinkedQueueNode[T](_)
    head.next = tail //compillation error here
    

    value 应该是 val(因为它在 DoubleLinkedQueue 中的各种方法中被访问)

    class DoubleLinkedQueueNode[T](val value: T) {
    

    希望对你有帮助。

    【讨论】:

      猜你喜欢
      • 2023-03-09
      • 1970-01-01
      • 1970-01-01
      • 2013-05-06
      • 2012-08-31
      • 1970-01-01
      • 2015-10-03
      • 1970-01-01
      • 2016-05-01
      相关资源
      最近更新 更多