Kotlin: общий параметр на классах и как они решаются - PullRequest
1 голос
/ 11 марта 2019

Мой вопрос в следующем примере: почему компилятор kotlin не знает реальный тип «fromParam»?

open class S<R>(val param : R)
class A : S<B>(B())
class B

fun <R> test(value : S<R>, param : R) {
    when(value) {
        is A -> {
            val fromClass : B = value.param 
            val fromParam : B = param // <- compiler error, found R required B
        }
    }
}

Хорошо, так что «fromClass» имеет конкретный тип «B», потому что когда выпереключить тип так, что есть неявное приведение, верно?Но по тому же принципу он должен знать, что «param» должен иметь конкретный тип «B», когда значением является «A», потому что общие параметры должны быть одинаковыми.Так почему же я не могу использовать «param» как B в этом случае?

1 Ответ

2 голосов
/ 11 марта 2019

Потому что дизайнеры не решили его поддерживать. Это действительно будет действительно (насколько я вижу), но все существующие умные приведения применяются только к проверенному значению. Так что, вероятно, было бы нетривиально добавить, и как часто это будет использоваться?

Этот вид уточнения типов поддерживается обобщенными алгебраическими типами данных , которые поддерживаются в Haskell и OCaml (и, в некоторой степени, в Scala), но их система типов и вывод типов весьма отличаются от Kotlin.

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