 <p>You need to explicitly define getter/setter in your interface. In our case (without changing structure and idea):</p> <pre><code>trait Node { def next: Node def next_=(node: Node) } // `var next: Node` generates implementations for `def next: Node` and `def next_=(node: Node)` case class SpecificNode(var next: Node) extends Node object NullNode extends Node { def next = throw new Exception("no more node") def next_=(node: Node) { throw new Exception("can't change next on null node") } } val n1 = SpecificNode(NullNode) val n2 = SpecificNode(SpecificNode(NullNode)) val n3: Node = SpecificNode(n1) // some function to test our structure: def length(n: Node, prev: Int = 0): Int = if (n == NullNode) prev else length(n.next, prev + 1) println(length(n3)) n3.next = n2 println(length(n3)) </code></pre> <p>Side note: this is mutable linked list, I suggest you to check how immutable list implemented in standard scala library</p>