Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Kotlin 泛型成员的默认值_Kotlin - Fatal编程技术网

Kotlin 泛型成员的默认值

Kotlin 泛型成员的默认值,kotlin,Kotlin,我正在尝试这个: class Foo<T> { var member: T = T() } class-Foo{ 变量成员:T=T() } …但是Kotlin编译器给了我一个错误:类型参数T不能作为函数调用 如何默认构造泛型成员变量?要访问类型信息,我们需要在类型上使用具体化的关键字,但这仅适用于内联函数。因此,与其依赖于直接构造,解决方法可以是使用包裹在伴生对象中的生成器函数,该函数在构造之后立即设置成员 // Test class to verify the impl

我正在尝试这个:

class Foo<T> {
    var member: T = T()
}
class-Foo{
变量成员:T=T()
}
…但是Kotlin编译器给了我一个错误:
类型参数T不能作为函数调用


如何默认构造泛型成员变量?

要访问类型信息,我们需要在类型上使用
具体化的
关键字,但这仅适用于内联函数。因此,与其依赖于直接构造,解决方法可以是使用包裹在伴生对象中的生成器函数,该函数在构造之后立即设置成员

// Test class to verify the implementation
class Yolo {
    override fun toString() = "Yolo swag"
}

class Foo<T : Any> {
    lateinit var member: T
    
    companion object {
        inline fun <reified T : Any> newInstance() = 
            T::class.java.newInstance().let { memberInstance ->
                Foo<T>().apply { member = memberInstance} 
            }
    }
}

fun main() {
    // generate a Foo<Yolo>
    val foo = Foo.newInstance<Yolo>()
    
    println(foo.member) // displays "Yolo swag"
}
//用于验证实现的测试类
尤罗班{
覆盖趣味toString()=“Yolo swag”
}
福班{
lateinit变量成员:T
伴星{
inline fun newInstance()=
T::class.java.newInstance().let{memberInstance->
Foo().apply{member=memberInstance}
}
}
}
主要内容(){
//生成一个Foo
val foo=foo.newInstance()
println(foo.member)//显示“Yolo swag”
}

这意味着
T
有一个公共的无参数构造函数,但在一般情况下它可能不是真的。这段代码使用反射来绕过编译器对它的抱怨(如果您不满足JVM的期望,并且确实在没有public no arg构造函数的情况下通过
T
,则可能会导致运行时错误)

//Kotlin(KT-33213)还不支持类级别的具体化泛型,
//所以您必须手动将'KClass'的实例作为构造函数参数传递
Foo类(clazz:KClass){
变量成员:T=clazz.createInstance()
}

这是否回答了您的问题?好吧,是的,除了我的问题要简洁得多之外……但还是关于同一个话题。你们都想拥有某种类型T的默认实例,答案是在kotlin中不可能。您必须使用nullable类型或提供类的实例。这是不可能的,因为Kotlin不支持默认类型。这意味着
t
有一个公共的无参数构造函数,但在一般情况下可能不是真的。