6

最近 Kotlin の学習を始めたので、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 ...

こことグーグルで検索してきましたが、このエラーの原因が何であるかわかりません

編集: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)
    }
}
4

1 に答える 1

4

問題は次の行にあると思います。

cur?.next = Node(n)

問題は、コンパイラが is の場合に何をすべきかわからないことcurですnull。現在、これにより内部エラーが発生しますが、これは将来のバージョンでサポートされる可能性があります。

cur今のところ、最善の解決策は、コンパイラが neverであることを確認できるようにコードを書き直すことnullです。var問題は、コンパイラが as として宣言されたフィールドがいつでも変更できると想定しているため、チェックする前にそれらの値をローカル変数にロードする必要があること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)
}
于 2014-09-22T04:05:09.237 に答える