gpt4 book ai didi

kotlin - 在 Kotlin 中实例化泛型类型

转载 作者:IT老高 更新时间:2023-10-28 13:32:20 29 4
gpt4 key购买 nike

在 Kotlin 中获取泛型类型实例的最佳方法是什么?我希望找到以下 C# 代码的最佳近似值:

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

最佳答案

编辑:正如评论中提到的,这可能是一个坏主意。接受 () -> T 可能是实现这一目标的最合理方法。也就是说,如果不一定以最惯用的方式,以下技术将实现您正在寻找的东西。

不幸的是,您无法直接实现这一点:Kotlin 受到其 Java 祖先的束缚,因此泛型在运行时被删除,这意味着 T 不再可以直接使用。不过,使用反射和内联函数,您可以解决这个问题:

/* We have no way to guarantee that an empty constructor exists, so must return T? instead of T */
inline fun <reified T : Any> getValue(): T? {
val primaryConstructor = T::class.constructors.find { it.parameters.isEmpty() }
return primaryConstructor?.call()
}

如果我们添加一些示例类,您可以看到当存在空构造函数时 this 将返回一个实例,否则返回 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 - 在 Kotlin 中实例化泛型类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43477903/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com