gpt4 book ai didi

generics - 如何将类型参数传递给泛型类构造函数引用?

转载 作者:行者123 更新时间:2023-12-04 21:09:34 26 4
gpt4 key购买 nike

假设以下代码:

class ConstructMe<T> {}
data class Test<T> constructor(var supplier: () -> ConstructMe<T>) {}

fun main(args: Array<String>) {
works<Int>()
breaks<Int>()
}

fun <T> works() {
Test<T>({ ConstructMe<T>() }) // (1) any one class type parameter can be removed like:
Test({ ConstructMe<T>() }) // (2) still works (class type inferred by argument type)
Test<T>({ ConstructMe() }) // (3) still works (argument type inferred by class type)
}

fun <T> breaks() {
Test<T>(::ConstructMe) // type interference failed (should probably work like (3); compiler improvement possible?)
Test<T>(::ConstructMe<T>) // type interference failed & type argument not allowed (language change necessary?)
}

我通过将 JavaFX 属性( SimpleIntegerPropertySimpleStringProperty 、...和 ​​ SimpleObjectProperty<T> )传递给泛型类构造函数 () -> Property<T> 遇到了这个问题参数,在那里通过 ::SimpleIntegerProperty工作没有问题,而 ::SimpleObjectProperty像上面的示例代码一样失败。

是否可以在这里改进编译器或允许将类型参数传递给构造函数/函数引用?
在这里对简单的 lambda 表达式使用构造函数引用是否有意义?它编译有什么不同吗?

最佳答案

是的,可以在这里改进编译器。它可以推断 ConstructMe 的类型参数.见问题 https://youtrack.jetbrains.com/issue/KT-10711 .

对于非内联外部函数(在这种情况下它是 Test 的构造函数),lambda 和对构造函数的可调用引用之间没有区别。对于这两种情况,编译器都会创建匿名类,该类具有方法 invoke创建 ConstructMe 的实例.

但是在构造函数有很多参数的情况下,可调用引用比 lambda 更方便。

关于generics - 如何将类型参数传递给泛型类构造函数引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37629644/

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