Почему я получаю ошибку `несоответствие типов приемника` для этого кода - PullRequest
0 голосов
/ 17 декабря 2018

Посмотрите на этот код:

import Moves.*
import ReverseMoves.*

interface Move {
    val opp : Move
}

enum class Moves(override val opp: Move) : Move {
    U(U_),
    R(R_),
    L(L_),
    D(D_),
    F(F_),
    B(B_),
}

enum class ReverseMoves(override val opp: Move) : Move {
    U_(U),
    R_(R),
    L_(L),
    D_(D),
    F_(F),
    B_(B),
}
val cornerMapping: Map<Move, IntArray> = mutableMapOf(
    U to intArrayOf(1, 2, 4, 3),
    R to intArrayOf(2, 6, 8, 4),
    L to intArrayOf(1, 3, 7, 5),
    D to intArrayOf(7, 8, 6, 5),
    F to intArrayOf(3, 4, 8, 7),
    B to intArrayOf(2, 1, 5, 6)
)

fun f() {
    for (m in cornerMapping) {
        cornerMapping.set(m.key.opp, m.value.reversed().toIntArray())
    }
}

При попытке скомпилировать этот код я получаю следующую ошибку:

t.kt:37:23: error: unresolved reference. None of the following candidates is applicable because of receiver type mismatch: 
@InlineOnly public inline operator fun <K, V> MutableMap<Move, IntArray>.set(key: Move, value: IntArray): Unit defined in kotlin.collections
@InlineOnly public inline operator fun kotlin.text.StringBuilder /* = java.lang.StringBuilder */.set(index: Int, value: Char): Unit defined in kotlin.text
        cornerMapping.set(m.key.opp, m.value.reversed().toIntArray())
                      ^

Я не понимаю, почему яПри получении этой ошибки типы ключа и значения, переданные в set, точно совпадают с типами, объявленными для cornerMapping.

1 Ответ

0 голосов
/ 17 декабря 2018

Я полагаю, что метод set не определен в Map.Вы можете изменить тип переменной cornerMapping на MutableMap, и она будет работать:

val cornerMapping: MutableMap<Move, IntArray> = mutableMapOf(
    Moves.U to intArrayOf(1, 2, 4, 3),
    Moves.R to intArrayOf(2, 6, 8, 4),
    Moves.L to intArrayOf(1, 3, 7, 5),
    Moves.D to intArrayOf(7, 8, 6, 5),
    Moves.F to intArrayOf(3, 4, 8, 7),
    Moves.B to intArrayOf(2, 1, 5, 6)
)

fun f() {
    for (m in cornerMapping) {
        cornerMapping[m.key.opp] = m.value.reversed().toIntArray()
    }
}

Это потому, что методы в интерфейсе Map поддерживают только доступ только для чтения к карте;доступ для чтения и записи поддерживается через интерфейс MutableMap.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...