Kotlin 相当于 C# new() 泛型约束

问题描述 投票:0回答:1

Kotlin 中是否有与以下 C# 代码等效的代码?

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

我知道我可以使用反射在运行时构造类型并执行错误检查,这是最好的选择吗?

kotlin generics generic-constraints
1个回答
0
投票

这在 Kotlin 中是不可能的,原因有两个:

  1. 键入擦除。函数甚至不“知道”
    T
    ,因此不可能构造它。
  2. 没有类似于
    where T:new()
    的构造可以确保类具有无参数构造函数。

我们可以通过使用具体化类型和反射在某种程度上解决第一个问题:

fun main() {
    val foo: Foo = create()
    val bar: Bar = create()
}

class Foo
class Bar

inline fun <reified T> create(): T {
    return T::class.constructors.single { it.parameters.isEmpty() }.call()
}

这远非理想。我们仍然无法从完全通用的上下文中调用该函数。另外,如果一个类没有无参数构造函数,它将在运行时抛出异常。

Kotlin 中更典型的模式是提供生产者:

fun main() {
    val foo = create(::Foo)
}

fun <T> create(producer: () -> T): T = producer()

我怀疑这对你来说不是很有用。

© www.soinside.com 2019 - 2024. All rights reserved.