在Kotlin中实例化一个泛型类型

在Kotlin中获得一个泛型类型的实例的最好方法是什么? 我希望找到以下C#代码的最佳(如果不是100%完美)近似值:

public T GetValue<T>() where T : new() { return new T(); } 

One Solution collect form web for “在Kotlin中实例化一个泛型类型”

编辑:正如评论中提到的,这可能是一个坏主意。 接受一个() -> T可能是实现这个最合理的方法。 也就是说,下面的技巧可以达到你要找的东西,不一定是最习惯的方式。

不幸的是,你不能直接实现这个目标:Kotlin受到其Java系统的束缚,所以泛型在运行时被删除,这意味着T不再可以直接使用。 使用反射和内联函数,你可以解决这个问题,但是:

 /* Convenience wrapper that allows you to call getValue<Type>() instead of of getValue(Type::class) */ inline fun <reified T: Any> getValue() : T? = getValue(T::class) /* We have no way to guarantee that an empty constructor exists, so must return T? instead of T */ fun <T: Any> getValue(clazz: KClass<T>) : T? { clazz.constructors.forEach { con -> if (con.parameters.size == 0) { return con.call() } } return null } 

如果我们添加一些示例类,您可以看到,如果存在空的构造函数,将返回一个实例,否则返回null:

 class Foo() {} class Bar(val label: String) { constructor() : this("bar")} class Baz(val label: String) fun main(args: Array<String>) { System.out.println("Foo: ${getValue<Foo>()}") // Foo@... // No need to specify the type when it can be inferred val foo : Foo? = getValue() System.out.println("Foo: ${foo}") // Foo@... System.out.println("Bar: ${getValue<Bar>()}") // Prints Bar@... System.out.println("Baz: ${getValue<Baz>()}") // null } 
  • Java lambdatypes推断在Kotlin中没有像预期的那样工作
  • 在子模块中的Android数据绑定
  • 警告:类路径中的Kotlin运行时JAR文件应该具有相同的版本
  • Kotlin中两个具有不同类型参数的函数
  • Android Kotlin计算速度(时间)
  • 测试Android Kotlin应用程序 - 用匕首Mockito注入null
  • 未解决的参考:kotlinx - Kotlin 1-0-0-RC-1036
  • 如何在使用短符号时在匿名监听器中引用“this”?
  • Kotlin mutableMap.put返回空值
  • 在Kotlin中,为什么在函数被分配给一个变量之后,默认参数没有被传递?
  • 如何将intArray转换为Kotlin中的ArrayList <Int>?
  • Kotlin language will be the best programming language for Android.