Функция расширения Котлина до неизвестного типа - PullRequest
0 голосов
/ 18 октября 2018

Можно ли использовать функцию расширения с функцией, которая возвращает неопределенный тип значения?

defaultPreferences(this)["some string"]?.let { ...

Я должен сделать это, чтобы избежать ошибки, но я действительно хочу, чтобы она была в одной строке.

val value: String? =  defaultPreferences(this)["some string"]
value?.let { ...

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

"Type inference failed: Not enough information to infer parameter T in inline operator fun <reified T : Any> SharedPreferences.get(key: String, defaultValue: T? = ...): T?
Please specify it explicitly."

Есть идеи?

Редактировать: Больше информации

Вотобъявление функции get.

inline operator fun <reified T : Any> SharedPreferences.get(key: String, defaultValue: T? = null): T? {

Ответы [ 2 ]

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

Если ваша встроенная функция - это то, что я думаю (when на T::class, и различные типы набираются как getString, getInt и т. Д. С небезопасным приведением результата) Вы должны воздержаться от использования.

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

Для некоторых примеров байт-кода Вы можете увидеть мой ответ на связанный вопрос.

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

Как насчет

defaultPreferences(this).get<String?>("some string")?.let {

?

...