できない.dev

Kotlin「Unresolved reference」の原因と直し方

Unresolved reference は、エラー文に出た名前の綴りを直し、import か依存を足せば直る。
コンパイラが、その名前の宣言をスコープの中に見つけられないと出る。

公開:

要約

Unresolved reference は、コンパイラが書かれた名前の宣言を見つけられないときのコンパイルエラーである。エラー文に出た名前の綴りを直し、足りない import か依存を足せば直る。

表示は、コンパイラの版と実行方法で少し変わる。

実行したもの表示
kotlinc 2.4error: unresolved reference 'printn'.
kotlinc 2.4(拡張関数など)error: unresolved reference 'shout' on receiver of type 'String'.
kotlinc 1.9error: unresolved reference: printn
Gradlee: file:///w1/src/main/kotlin/App.kt:1:8 Unresolved reference 'kotlinx'.

エラー文の App.kt:1:8 はファイルの行と列を指す。
依存が足りないときは同じエラーが何行も並ぶので、先頭の行から順に読む。

解決策

1. 綴りを直す

エラー文の行と列にある名前を、宣言と同じ綴りに直す。

2. import を足す

import java.time.LocalDate
import com.example.ext.shout
 
fun main() {
    println(LocalDate.of(2026, 1, 2))
    println("a".shout())
}

拡張関数は、"a".shout() のようにメンバーと同じ形で呼ぶので、import が必要なことに気づきにくい。on receiver of type が付いたエラーでは、その型のメンバーか、import されていない拡張関数かを確かめる。

3. 依存を足す

Gradle なら、dependencies に足して取得元の repositories も書く。

plugins {
    kotlin("jvm") version "2.2.21"
}
 
repositories {
    mavenCentral()
}
 
dependencies {
    implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.10.2")
}

kotlinc を直接使うなら、-cp で jar を渡す。

kotlinc -cp kotlinx-coroutines-core-jvm-1.10.2.jar App.kt -d out

4. 宣言を外へ出す

fun main() {
    val total = 1
    if (true) {
        println(total)
    }
    println(total)
}

5. plugins を書く

build.gradle.kts で implementation が解決できないときは、手順 3 の plugins のブロックを先頭に足す。
古い書き方の compile で同じエラーが出ているなら、Gradle の記事のとおり implementation に書き換える。

よくある原因

  1. 名前の綴りを間違えている。println を printn と書くと、この名前の関数は無いので解決できない。
  2. 別のパッケージの宣言を import していない。java.time.LocalDate のようなクラスも、自分で定義した拡張関数も、パッケージが違えば import が要る。
  3. ライブラリを依存に足していない。import kotlinx.coroutines.delay の行で unresolved reference 'kotlinx' が出て、使っている箇所のエラーがそのあとに続く。
  4. ブロックの中で宣言した変数を、ブロックの外から使っている。if の中の val total は、その if を出ると見えなくなる。
  5. build.gradle.kts で plugins を書いていない。implementation はプラグインが用意する設定なので、無いと Unresolved reference 'implementation' と Script compilation error が出る。

private のメンバーを外から呼んだ場合は名前が見つかるので、このエラーではなく cannot access 'val x: Int': it is private in 'A'. が出る。