Kotlin, NoSuchMethodError в операторе get [ ]

У меня есть этот код в библиотеке третьей части моя:

class Program {

    val uniforms = HashMap<String, Int>()    
    operator fun get(s: String) = uniforms[s]!!
}

Когда я использую оператор [ ]

glUniformMatrix4fv(uniformColor.uniforms["cameraToClipMatrix"], 1, false, matBuffer)

Я получаю это:

Вызвано: java.lang.NoSuchMethodError: glsl.Program.get(Ljava/lang/String;)I

Почему?

Все кажется хорошо

uniformColor.uniforms.contains["cameraToClipMatrix"]

возвращает true, а если нет, он должен просто вернуть null

Что мне не хватает?

котлин 1.1-rc-91


person elect    schedule 28.02.2017    source источник


Ответы (2)


Это похоже на ошибку в компиляторе Kotlin.

Map.get в Java — это Object->Object, а K->V в Kotlin.

Я подозреваю, что это приводит к тому, что реализация генерирует fun get(s: String):Any?, а сайт вызова пытается найти fun get(s: String):Int.

person aimozg    schedule 28.02.2017
comment
Похоже, это ошибка в той версии RC, в версии 1.0.6 это работает нормально. - person Augusto; 28.02.2017
comment
Кто-нибудь подавал отчет об ошибке для этого? - person Ruckus T-Boom; 28.02.2017

Это пример, который я пробовал, и он у меня работает (даже при вызове из Java) на 1.1.0-rc-91. Что мне не хватает?

class Program {

    val uniforms = HashMap<String, Int>()

    operator fun get(s: String): Int = uniforms[s]!!

}

fun main(args: Array<String>) {

    val program = Program()

    program.uniforms.put("hello", 42)

    println(program["hello"])

}
person zsmb13    schedule 28.02.2017
comment
Это не сработает, если вы удалите : Int для оператора [ ] (и, возможно, добавите его как зависимость) - person elect; 28.02.2017
comment
О верно. Удаление явного типа и использование его из другого файла приводит к ошибке, с которой вы столкнулись. - person zsmb13; 28.02.2017
comment
Обновление: Kotlin 1.1 только что был выпущен, и я больше не могу воспроизвести проблему. - person zsmb13; 01.03.2017
comment
К сожалению, я все еще могу это сделать.. uff - person elect; 01.03.2017
comment
О, неважно, я перепроверил сейчас, и оказалось, что я просто испортил тест. Все равно вылетает. Извиняюсь. - person zsmb13; 01.03.2017
comment
Это как-то успокаивает :p - person elect; 01.03.2017