Почему этот код Kotlin имеет несоответствие типов? - PullRequest
0 голосов
/ 23 мая 2018

Ваша задача - реализовать функцию indexOfMax (), чтобы она возвращала индекс самого большого элемента в массиве, или ноль, если массив пуст.

package maxindex

import kotlin.collections.*

fun indexOfMax(a: IntArray): Int? {
    if (a.isNotEmpty()) {
        var maxValue = a.max()
        return a.indexOf(maxValue) // Type mismatch
    } else {
        return null
    }
}

Ответы [ 2 ]

0 голосов
/ 24 мая 2018

a.max() возвращает null тогда и только тогда, когда a пусто.Поэтому внутри if (a.isNotEmpty()) оно никогда не будет нулевым, а a.indexOf(maxValue) принимает ненулевое Int.

Так что с этим кодом все будет в порядке, но система типов Котлина не может выразить "a.max() никогда не возвращает null, если a не пусто" и не отслеживает пустоту массива так же, какотслеживает обнуляемость.Так что вам нужно разобраться с делом maxValue == null, даже если это на самом деле не может произойти.

0 голосов
/ 23 мая 2018

Я помню, когда я впервые начал с Kotlin, и я был озадачен, когда он сказал что-то вроде «эта переменная изменчива, поэтому безопасное приведение не разрешено», и я понятия не имел, что происходит:)

В любом случае, вы получаете несоответствие типов, потому что язык имеет тип nullability.Таким образом, вы не можете потенциально дать null indexOf, потому что он требует, чтобы он был ненулевым Int.

Если вы проверите исходный код для max():

public fun IntArray.max(): Int? {
    if (isEmpty()) return null
    ....

Так что может дать вам null, и поэтому вы получите

val maxValue: Int? = a.max()

, где вы не можете указать maxValue в качестве аргумента для indexOfпотому что он ожидает Int, а не Int?.

Таким образом, решение состоит в том, чтобы обработать случай null явно:

return maxValue?.let { a.indexOf(it) } ?: null

Но теперь, основываясь на том, что мы знаемВы могли бы значительно сократить количество строк кода следующим образом:

fun indexOfMax(a: IntArray): Int? = a.max()?.let { a.indexOf(it) }

, который вы позже сможете превратить в функцию расширения:

fun IntArray.indexOfMax(): Int? = max()?.let { indexOf(it) }

Удачи с вашимпутешествие через Котлин.Лично я думаю, что коаны очень раздражают, я предпочел конвертировать код Java в Kotlin, чтобы увидеть, каково это изучать начальные синтаксические особенности.

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