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

Function Kotlin:作为返回类型的泛型函数?,function,generics,lambda,kotlin,Function,Generics,Lambda,Kotlin,在Kotlin中,是否可以将泛型函数类型声明为函数的返回类型 在Java中,我想要实现的目标如下: 接口工厂{ 静态工厂实例=new FactoryImpl(); T创建(字符串名称、类类型); } 类PrefixedFactory实现工厂{ 私有最终字符串前缀; PrefixedFactory(字符串前缀){ this.prefix=前缀; } @凌驾 公共T创建(字符串名称、类类型){ 返回Factory.INSTANCE.create(前缀+名称,类型); } } (请注意,在本例中,我

在Kotlin中,是否可以将泛型函数类型声明为函数的返回类型

在Java中,我想要实现的目标如下:

接口工厂{
静态工厂实例=new FactoryImpl();
T创建(字符串名称、类类型);
}
类PrefixedFactory实现工厂{
私有最终字符串前缀;
PrefixedFactory(字符串前缀){
this.prefix=前缀;
}
@凌驾
公共T创建(字符串名称、类类型){
返回Factory.INSTANCE.create(前缀+名称,类型);
}
}
(请注意,在本例中,我使用静态字段访问工厂实例,以避免将泛型函数作为参数传递,这将在Kotlin中显示其自身的问题)。 我想将前缀器转换为kotlin函数,但似乎不可能将泛型函数声明为返回类型:

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

请注意,该项目以结束的形式出现。现在我想在一个不同的插件中重用这个助手,所以我想为不同的项目实例使用一个工厂来创建这个函数。

你做得几乎正确。您只需要直接在
前缀器
函数中定义通用部分

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

根据您的实际实现情况,您可以查看关键字。

下面这行代码是编译的:

fun <T : Any> prefixer(prefix: String): (String, KClass<T>) -> T = TODO()
fun前缀器(前缀:String):(String,KClass)->T=TODO()
首先,通用减速应该在fun关键字之后

然后它必须声明为Any类型。默认值是多少?但是KClass只接受任何内容。

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


如果有人问我同样的问题,但没有像
Factory
这样的界面,我建议创建这个界面作为一个解决方案。

尽管我对@Alexey的回答感到失望,但我发现一个更精简的解决方案利用了Kotlin的运营商。以下内容使其在使用时更像lambda:

private class Prefixer(private val: String) {
    operator fun <T> invoke(name: String, type: Class<T>): T {
        TODO()
    }
}

如有必要,请随时更换为
KClass
。实际上,我使用这个函数的目的略有不同。

但是返回的函数不是泛型的,它固定在调用
prefixer
时的
T
上。与@RobCo的答案相同的问题在这里也适用-我基本上想要返回一个等价于
fun(String,KClass)->T
,但我不能将其指定为返回类型。您如何实现这样的泛型函数?您必须将其存储在保存非泛型信息的变量中。不管怎样,你必须从那里投下它。也许在你真正想要达到的目标上再延伸一点。
fun <T : Any> prefixer(prefix: String): (String, KClass<T>) -> T = TODO()
private class Prefixer(private val: String) {
    operator fun <T> invoke(name: String, type: Class<T>): T {
        TODO()
    }
}
val createMy = Prefixer("MyPrefix")
val result = createMy("Configuration", Configuration::class.java)