Scala:value next不是T编译错误的成员

时间:2015-11-27 15:46:09

标签: scala

拥有代码:

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 = tail

有人知道如何解决它吗?

UPD1 是否与here描述的问题相同?

3 个答案:

答案 0 :(得分:0)

您可以使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]

答案 1 :(得分:0)

似乎是一个很好的解决方案是在DoubleLinkedQueueNode中使用Option作为'val'的类型。

答案 2 :(得分:0)

如果您决定创建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

值应为val(因为它在DoubleLinkedQueue中以各种方法访问)

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

希望它有所帮助。