Kotlin - получить ненулевой вывод логического типа - PullRequest
0 голосов
/ 07 июня 2018

Я хочу знать, можно ли заставить kotlin выводить ненулевое значение вывода данного типа.Рассмотрим следующий пример:

abstract class Wrapper<T>
class StringWrapper : Wrapper<String>()

fun <O, P> wrap(property: KProperty1<O, P>, wrapper: Wrapper<P>) {

}

Когда я вызываю wrap для свойства, не допускающего обнуление, все работает отлично:

data class NonNullableExample(val value: String)
wrap(NonNullableExample::value, StringWrapper())

Но когда я вызываю wrap для обнуляемогосвойство, я получаю ошибку компилятора, потому что логический вывод P обнуляем, тогда как StringWrapper не является:

data class NullableExample(val value: String?)
wrap(NullableExample::value, StringWrapper())

Сбой логического вывода: невозможно определить параметр типа P в

fun <O, P> wrap(property: KProperty1<O, P>, wrapper: Wrapper<P>): Unit

Ни одна из следующих замен

(KProperty1<NullableExample, String>, Wrapper<String>)

(KProperty1<NullableExample, String?>, Wrapper<String?>)

может применяться к

(KProperty1<NullableExample, String?>, StringWrapper)

Так что, в принципе, я хочу, независимо от того, является ли P обнуляемым или не обнуляемым, P из Wrapper<P> всегда должно быть ненулевой формойP.Это возможно?

1 Ответ

0 голосов
/ 07 июня 2018

В общем, то, что я хочу, независимо от того, является ли P обнуляемым или ненулевым, P из Wrapper<P> всегда должно быть ненулевой формой P.

Это не совсем имеет смысла, как сказано: есть только один P, а не отдельный в Wrapper<P> и KProperty1<O, P>.Поэтому, если вы хотите, чтобы они были разными, вы не можете использовать P для обоих.

Но KProperty1 ковариантен в типе результата, поэтому KProperty1<O, P> также является KProperty1<O, P?>.Поэтому, если вы измените подпись на

fun <O, P : Any> wrap(property: KProperty1<O, P?>, wrapper: Wrapper<P>): Unit

, она будет принимать как обнуляемые, так и не обнуляемые свойства:

wrap(NonNullableExample::value, StringWrapper())
wrap(NullableExample::value, StringWrapper())
// both compile
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...