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
有一个公共的无参数构造函数,但在一般情况下可能不是真的。