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

7
假设以下代码:
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则像上面的示例代码一样失败。
是否可能改进编译器或允许将类型参数传递给构造函数/函数引用?在这里使用构造函数引用是否有意义?它是否编译得不同?
1个回答

3
是的,可以在这里改进编译器。它可以为ConstructMe推断类型参数。请参见问题https://youtrack.jetbrains.com/issue/KT-10711
对于非内联计数器函数(在这种情况下,它是Test的构造函数),Lambda和对构造函数的可调用引用之间没有区别。对于这两种情况,编译器都会创建一个匿名类,该类具有方法invoke,该方法创建ConstructMe的实例。
但是,在构造函数具有许多参数的情况下,可调用引用比Lambda更方便。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接