Странные ошибки компиляции в равенстве: (нет доступного метода equals (Any?): Boolean) - PullRequest
0 голосов
/ 28 октября 2018

Следующий код

fun main(args: Array<String>) {
    val a = listOf('A', Pair('X', 'Y')) 

    println(a[0] == 'B')
}

выдает ошибки компиляции:

Error:(4, 17) Unresolved reference: ==
Error:(4, 17) No method 'equals(Any?): Boolean' available

как на скриншоте: screenshot

Почемуэти ошибки компиляции происходят?

РЕДАКТИРОВАТЬ 1 : Кажется, это не связано с выражением когда.

РЕДАКТИРОВАТЬ 2 : КодФрагмент (нажмите кнопку «Выполнить» в правом верхнем углу для компиляции)
Мне нужно привести в действие вручную, чтобы избежать ошибки компиляции.Использование умного броска также не работает.(Или val a: List<Any> = listOf('A', Pair('X', 'Y')) работает)

Ответы [ 2 ]

0 голосов
/ 29 октября 2018

Отказ от ответственности: Этот ответ основан на Kotlin 1.2.71.Если вы не можете воспроизвести описанное поведение, пожалуйста, проверьте свою версию Kotlin (плагина).

Как было отмечено в комментариях и ответе Лиора Барона, предполагаемый тип для val a = listOf('A', Pair('X', 'Y')) равенList<Serializable>.

Странно то, что если вы позволите Kotlin определить тип, вы не сможете скомпилировать:

val a = listOf('A', Pair('X', 'Y')) 
println(a[0] == 'B')

, но если указать тип явно:

val a = listOf<Serializable>('A', Pair('X', 'Y'))

так и будет.Это не будет работать на игровой площадке Kotlin ( try.kotlinlang.org ), давая:

Ошибка: невозможно получить доступ к «Сериализуемому»: это внутреннее в «kotlin.io»

но если вы компилируете его локально.Это должно быть подано как ошибка.

0 голосов
/ 28 октября 2018

Это сложный случай.

Самый высокий общий знаменатель между Char и Pair оказывается интерфейсом Serializable, который не определяет метод equals().listOf(...) тип по умолчанию определяется как наибольший общий знаменатель его элементов.

Преобразование массива в List позволит использовать функцию equals(), реализованную в Any, поэтому код будет работать:

fun main(args: Array<String>) {
  val a = listOf('A', Pair('X', 'Y')) as List<Any>

  println(a[0] == 'B')
  println(a[0] == Pair('X', 'Y'))

  if (a[0] is Char) {
    println(a[0] == 'A')
  }

  println((a[0] as Char) == 'A')
}

Немного более элегантно было бы определить тип Any специально:

val a = listOf<Any>('A', Pair('X', 'Y'))

...