【发布时间】:2016-06-04 11:26:02
【问题描述】:
假设以下代码:
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 表达式是否有意义?它的编译方式有什么不同吗?
【问题讨论】:
标签: generics reflection kotlin type-parameter constructor-reference