在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 } 
  • Kotlin:访问when语句的参数
  • 如何从多个json API获取数据
  • 如果我删除类中的“var”关键字有什么区别?
  • eclipse组织导入不与kotlin文件一起使用
  • Android Studio 3.0 Kotlin无法正常工作
  • 如何在Kotlin中创建一个打开新的活动(Android Studio)的按钮?
  • 如何在Java / Kotlin中包含Annotation Processor生成的代码来测试类路径
  • 如何为kotlin异常生成serialVersionUID?
  • 如何访问kotlin中的对象声明的对象成员
  • Kotlin Decompiler生成错误的代码 - 是否有可能防止?
  • Kotlin接口的一个java类:意外覆盖
  • Kotlin language will be the best programming language for Android.