Я пытаюсь создать функцию, которая возвращает значение по умолчанию, если получатель имеет нулевое значение для чисел.Однако, когда я проверяю тип полученного значения, оно не совпадает с получателем, вместо этого оно совпадает со значением по умолчанию, которое я передал в качестве аргумента.
fun <T : Number> T?.orDefault(value: T): T = this ?: value
Тестирование вышеупомянутой функции скод ниже:
fun main(args: Array<String>) {
val b: Double? = null
val default : Int = -1
val orDefault = b.orDefault(default)
println(orDefault)
println(orDefault.javaClass.name)
}
Вывод выглядит примерно так:
// Output:
-1
java.lang.Integer
Когда я попробовал это, введя еще один J
, расширяющий T
, это все равно не удается.Запуск с вышеупомянутым основным методом все еще не удается.
fun <T : Number, J : T> T?.orDefault(value: J): T = this ?: (value as T)
// Output:
-1
java.lang.Integer
Ни в одном из случаев он не возвращает double.Что здесь не так?
РЕДАКТИРОВАТЬ :
Я закончил тем, что сделал что-то вроде этого:
fun <T : Number, J : Number> T?.orDefault(value: J): T = this ?: (value as T)
Таким образом, он гарантирует, что возвраттип совпадает с типом получателя.Тем не менее, единственным недостатком является то, что для приемника Null Int
он примет Double
по умолчанию и приведёт к Int
для возврата.