Как определить общий аргумент, который расширяет nullable, но не обнуляется сам - PullRequest
0 голосов
/ 23 октября 2018

В Kotlin есть способ определить ненулевой универсальный аргумент, который является подтипом обнуляемого типа?Я думал, что могу сделать что-то вроде

class nullableToNonnullable<A: Any?, B> where B: A, B: Any {
    fun toNonNull(a: A): B
}

, но я получаю ошибку времени компиляции:

Параметр типа не может иметь никаких других границ, если он ограничен другим параметром типа

Прямо сейчас я могу обойти это только с помощью типа оболочки, что-то вроде Option

class nullableToNonnullable<A: Any> {
    fun toNonNull(a: Option<A>): A
}

1 Ответ

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

Я не знаю, что именно вы пытаетесь сделать, но функция

(обнуляемый A) -> (не ноль A)

class nullableToNonnullable<A: Any> {
    fun toNonNull(a: A?): A
}

(обнуляемый A) ->(не нулевой подтип A) функция

class nullableToNonnullable<A: Any, B : A> {
    fun toNonNull(a: A?): B
}

Здесь параметр типа A в классе должен быть задан как ненулевой, хотя функция может вводить обнуляемые параметры.

Iне думайте, что вы можете ограничить один из параметров типа класса быть обнуляемым (не должен быть не нулевым), а один из них может быть как подтипом первого, так и ненулевым в Kotlin.

И ядумаю, вам не нужен класс в данном случае.

fun <A : Any> toNonNull(a: A?): A

и

fun <A : Any, B : A> toNonNull(a: A?): B
...