Список связанных со списком в Котлине

Недавно я начал изучать Kotlin, поэтому решил реализовать в нем некоторые структуры данных. Итак, я пробовал реализовать односвязный список:

package datastructures public class LinkedList { private data class Node(var nodeValue: Int, var next: Node? = null) private var head: Node? = null fun insert(n: Int) { if(head == null) head = Node(n) else { var cur = head while(cur?.next != null) { cur = cur?.next } cur?.next = Node(n) } } fun print() { var cur = head while(cur != null) { print("${cur.nodeValue} ") cur = cur?.next } } } fun main(args: Array<String>) { val n = LinkedList() n.insert(5) n.insert(3) n.print() } 

и я получил следующую ошибку:

 Error:(22, 13) Kotlin: [Internal Error] org.jetbrains.jet.codegen.CompilationException: Back-end (JVM) Internal error: cannot store to value org.jetbrains.jet.codegen.StackValue$OnStack@a0a447f Cause: cannot store to value org.jetbrains.jet.codegen.StackValue$OnStack@a0a447f File being compiled and position: (22,13) in C:/Users/Khaled/IdeaProjects/Kotlin/src/LinkedList.kt PsiElement: cur?.next = Node(n) The root cause was thrown at: StackValue.java:75 at org.jetbrains.jet.codegen.ExpressionCodegen.genQualified(ExpressionCodegen.java:243) at org.jetbrains.jet.codegen.ExpressionCodegen.genStatement(ExpressionCodegen.java:262) at ... 

Я искал здесь и в google, но я не могу понять, в чем проблема, вызывающая эту ошибку

Изменить: Поэтому я попытался повторно реализовать функцию insert и использовать requireNotNull() чтобы избежать компилятора о нулевой безопасности.

Вот код, и теперь он работает:

 fun insert(n: Int) { if (head == null) head = Node(n) else { var cur = head!! while (cur.next != null) { cur = cur.next!! } cur.next = Node(n) } } 

Solutions Collecting From Web of "Список связанных со списком в Котлине"

Я думаю, что проблема заключается в этой строке:

 cur?.next = Node(n) 

Проблема в том, что компилятор не знает, что делать, если cur равно null . В настоящее время это приводит к внутренней ошибке, но это может поддерживаться в будущей версии.

На данный момент лучшим решением является переписать код таким образом, чтобы компилятор мог проверить, что cur никогда не является null . Проблема заключается в том, что компилятор предполагает, что поля, объявленные как var могут меняться в любое время, поэтому их значения необходимо загружать в локальные переменные перед проверкой на null :

 var cur = head if(cur == null) head = Node(n) else { var next = cur.next while(next != null) { cur = next next = cur.next } cur.next = Node(n) }