【问题标题】:How to pass a type parameter to a generic class constructor reference?如何将类型参数传递给泛型类构造函数引用?
【发布时间】: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 属性(SimpleIntegerPropertySimpleStringProperty、...和SimpleObjectProperty&lt;T&gt;)传递给泛型类构造函数() -&gt; Property&lt;T&gt; 参数遇到了这个问题,其中传递::SimpleIntegerProperty 没有问题,而::SimpleObjectProperty 像上面的示例代码一样失败。

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

【问题讨论】:

    标签: generics reflection kotlin type-parameter constructor-reference


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-29
      • 1970-01-01
      相关资源
      最近更新 更多