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

class Config {
    inline operator fun <reified T> get(v:String):T = ...
}

Я хотел бы вызвать эту функцию из строкового шаблона, как показано ниже:

val c = Config()
val v:String = "value of key is: ${c["key"]}"

Когда я пытаюсь это сделать, я получаю предупреждение о компиляции, в котором говорится следующее:

Error:(26, 19) Kotlin: Type inference failed: Not enough information to 
infer parameter T in inline operator fun <reified T> get(v: String): T
Please specify it explicitly.

Я знаю, что следующий код работает

val c = Config()
val s:String = c["key"]
val v:String = "value of key is: $s"

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

Использование приведения, похоже, не работает:

val v:String = "value of key is: ${c["key"] as String}"
2
knelson 11 Мар 2018 в 01:30

1 ответ

Лучший ответ

Я думаю, что единственное, что работает в текущей версии (1.2.30), - это использовать метод get вместо скобок и явно указывать параметр типа:

val v = "value of key is: ${c.get<String>("key")}"

Насколько я понимаю, приведение типов должно работать (начиная с Kotlin 1.2 компилятор может выводить ожидаемые типы из приведений), но в этом конкретном случае это не работает, что может быть ошибкой, поэтому вы можете захотеть подать сообщение о проблеме с YouTrack.

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

1
yole 11 Мар 2018 в 01:45