Что именно не так тут: class C( var x : T = T.MAX_VALUE)

class C<T>( var x : T = T.MAX_VALUE)

В Kotlin новичёк, и, в основном, опираюсь на знание C++. С его точки зрения тут всё в порядке. Однако Kotlin говорит:

Type parameter 'T' cannot have or inherit a companion object, so it cannot be on the left hand side of dot

В принципе, примерно понятно, хотя туманно, но главное — а как, вообще, провернуть такую вот инициализацию?


Ответы (1 шт):

Автор решения: KeyGenQt

Default для generics

class C<T> protected constructor(val x: T) {
    companion object {

        const val DEFAULT_INT = 0
        const val DEFAULT_STRING = "DEFAULT"

        inline fun <reified T> newInstance(x: T? = null): C<T>? {
            return x?.let {
                C(x)
            } ?: run {
                when (T::class) {
                    Int::class -> C(DEFAULT_INT as T)
                    String::class -> C(DEFAULT_STRING as T)
                    else -> null
                }
            }

        }
    }
}

println(C.newInstance(12)?.x) // 12
println(C.newInstance<Int>()?.x) // 0

println(C.newInstance("TEXT")?.x) // TEXT
println(C.newInstance<String>()?.x) // DEFAULT

println(C.newInstance(1000L)?.x) // 1000
println(C.newInstance<Long>() ?: "NOT FOUND") // NOT FOUND
→ Ссылка