假设以下代码:
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属性(SimpleIntegerProperty
,,SimpleStringProperty
...和SimpleObjectProperty<T>
)传递给泛型类构造函数() -> Property<T>
参数来实现这一点,在该参数中传递::SimpleIntegerProperty
可以毫无问题地进行,而::SimpleObjectProperty
失败如上述示例代码。
是否可以在此处改进编译器,或者允许将类型参数传递给构造函数/函数引用?在这里在简单的lambda表达式上使用构造函数引用甚至有意义吗?它的编译方式是否有所不同?
是的,可以在此处改进编译器。它可以推断的类型参数ConstructMe
。参见问题https://youtrack.jetbrains.com/issue/KT-10711。
对于非内嵌的ounter函数(在这种情况下,它是Test的构造函数),lambda和可调用的构造函数引用之间没有区别。对于这两种情况,编译器都会创建一个匿名类,该类具有invoke
创建实例的方法ConstructMe
。
但是在构造函数有很多参数的情况下,可调用引用比lambda更方便。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句