如何实例化泛型类型的新实例

时间:2015-10-21 22:41:31

标签: kotlin

在C#中,您可以在泛型上放置一个新约束来创建泛型参数类型的新实例,在Kotlin中是否有等价物?

现在我的工作是:

someMethod<MyClass>(::MyClass)

我正在调用someMethod(),就像这样

fun <T : new> someMethod() {
    val newInstance = T()
}

但我想做这样的事情:

{{1}}

这可能吗?

2 个答案:

答案 0 :(得分:13)

目前,这是不可能的。您可以对问题https://youtrack.jetbrains.com/issue/KT-6728竖起大拇指,以投票赞成添加此功能。

至少,您可以省略泛型类型,因为Kotlin可以推断它:

someMethod(::MyClass)

答案 1 :(得分:0)

解决方案:

1 /使用具有保留的param类型(重复类型)的内联函数

2 /在此内联函数中,使用类自省(反射*)来调用所需的构造函数    /!\内联函数不能嵌套/嵌入在类或函数中

在一个简单的例子中,让我们看看它是如何工作的:

// Here's 2 classes that take one init with one parameter named "param" of type String
//!\ to not put in a class or function

class A(val param: String) {}
class B(val param: String) {}

// Here's the inline function.
// It returns an optional because it could be passed some types that do not own
// a constructor with a param named param of type String

inline fun <reified T> createAnInstance(value: String) : T? {

    val paramType = String::class.createType() //<< get createAnInstance param 'value' type

    val constructor = T::class.constructors.filter {
        it.parameters.size == 1 && it.parameters.filter { //< filter constructors with 1 param
            it.name == "param" && it.type == paramType //< filter constructors whose name is "param" && type is 'value' type
        }.size != 0
    }.firstOrNull() //< get first item or returned list or null

    return constructor?.call(value) // instantiate the class with value

}

// Execute. Note that to path the type to the function val/var must be type specified. 

val a: A? = createAnInstance("Wow! A new instance of A")

val b: B? = createAnInstance("Wow! A new instance of B")

*)kotlin-reflect.jar必须包含在项目中

在Android Studio中:添加到build.gradle(模块:app):实现“ org.jetbrains.kotlin:kotlin-reflect:$ kotlin_version”