Kotlin:泛型函数作为返回类型?

在Kotlin中,是否可以声明一个泛型函数类型作为函数的返回类型?

我想要在Java中看起来像这样:

interface Factory { static Factory INSTANCE = new FactoryImpl(); <T> T create(String name, Class<T> type); } class PrefixedFactory implements Factory { private final String prefix; PrefixedFactory(String prefix) { this.prefix = prefix; } @Override public <T> T create(String name, Class<T> type) { return Factory.INSTANCE.create(prefix + name, type); } } 

(请注意,在本例中,我使用静态字段访问Factory实例,以避免将泛型函数作为参数传递,这会在Kotlin中显示自己的问题)。 我想将前缀转换为kotlin函数,但似乎不可能将泛型函数声明为返回类型:

 fun prefixer(prefix: String): <T> (String, KClass<T>) -> T { TODO() } 

这当然不会编译。 在我看来,与Java的功能接口相比,这是一个限制。 有没有办法做到这一点,或解决方法?

(编辑)澄清

我希望实际的结果函数是通用的。 如果我做

 fun <T: Any> prefixer(prefix: String): (String, KClass<T>) -> T { TODO() } 

正如现在的答案所表明的 我没有得到一个泛型函数,而是我得到(String, KClass<Foo>) -> Foo如果我调用prefixer<Foo>("") 。 所以这个函数只能用Foo调用,而这种情况下的工厂函数prefixer是泛型的,结果不是。 我希望能消除误解。

我的用例在Gradle插件中,我写了一个类似于这个的帮助器方法,它为每个创建的任务应用一些默认值:

 val myPrefix = "..." val project: Project = <from context> fun <T: Task> String.task(type: KClass<T>, doConfig: T.() -> Unit) { project.tasks.create("$prefix$this", type.java, { it.doConfig() }) } 

请注意,该项目作为关闭进入。 现在我想在不同的插件中重用这个帮助器,所以我想用一个工厂为不同的项目实例创建这个函数。

3 Solutions collect form web for “Kotlin:泛型函数作为返回类型?”

你正在做的几乎是正确的。 您只需要直接在prefixer函数中定义泛型部分。

 fun <T: Any> prefixer(prefix: String): (String, KClass<T>) -> T { TODO() } 

根据你实际的实现,你可以看看reified关键字。

下面一行是编译的:

 fun <T : Any> prefixer(prefix: String): (String, KClass<T>) -> T = TODO() 

首先,通用减速应该在fun关键字后面。

那么它必须被声明为Any类型。 默认是Any? 但KClass只需要任何。

不,这是不可能的(据我所知)。 这种类型的技术术语是“更高级的类型”,很少有语言支持它们,在JVM上我只知道Scala。

如果有人问我同样的问题,而没有像Factory这样的界面,我会建议创建这个接口作为一种解决方法。

  • 在Kotlin中可变参数的lambdatypes?
  • Kotin如何指定在Lambda中封闭的退货标签
  • Mocktito ArgumentCaptor Kotlin lambda与参数
  • 为什么kotlin lambda反编译为java代码是(Function0)null.INSTANCE
  • 如何检查kotlin中的lambda空虚
  • 使用java lambda调用kotlin函数时,Kotlin无法访问kotlin.jvm.functions.Function1
  • Kotlin:使用lambda代替function界面?
  • Kotlin,Proguard和lambda
  • Kotlin:使用lambda代替功能界面?
  • Lambda在Kotlin中使用通配符
  • 用Kotlin和lambda返回接口实现
  • Kotlin language will be the best programming language for Android.