Generics Kotlin函数返回值的默认通用参数
我有一个基于传递的参数返回泛型类型的函数,但我不能设置它的默认值。下面是我的示例函数:Generics Kotlin函数返回值的默认通用参数,generics,kotlin,Generics,Kotlin,我有一个基于传递的参数返回泛型类型的函数,但我不能设置它的默认值。下面是我的示例函数: fun <T : BaseClass> parse(json: String, gson: Class<T> = BaseClass::class): T = Gson().fromJson(json, gson) fun解析(json:String,gson:Class=BaseClass::Class):T= Gson().fromJson(json,Gson) 但是,我得
fun <T : BaseClass> parse(json: String, gson: Class<T> = BaseClass::class): T =
Gson().fromJson(json, gson)
fun解析(json:String,gson:Class=BaseClass::Class):T=
Gson().fromJson(json,Gson)
但是,我得到默认参数的类型不匹配错误:预期为Class
,发现为Class
。
我可以使用第二个函数实现相同的功能:
fun <T : BaseClass> parse(json: String, gson: Class<T>): T =
Gson().fromJson(json, gson)
fun BaseClass parse(json: String) =
parse(json, BaseClass::class)
fun解析(json:String,gson:Class):T=
Gson().fromJson(json,Gson)
趣味基类解析(json:String)=
解析(json,基类::类)
这看起来不像科特林。是否可以使用默认的通用参数?谢谢。您的第一行代码在实践中无法使用。如果你这样做会发生什么
class Derived: BaseClass()
val x = parse<Derived>(someJson)
派生类:基类()
val x=parse(someJson)
它将违反它自己对泛型类型的定义
您的上述解决方案可能是您为您的用例所能做的最好的解决方案。你也可以考虑使用这样的归化类型:
inline fun <reified T : BaseClass> parse(json: String): T =
Gson().fromJson(json, T::class)
inlinefun解析(json:String):T=
Gson().fromJson(json,T::class)
这不会为您提供任何默认值,但它允许编译器在可能的情况下推断类型,因此在某些情况下,您不必指定类:
fun someFunction(derived: Derived) {
//...
}
someFunction(parse(someJson)) // no need to specify <Derived>
fun-someFunction(派生:派生){
//...
}
someFunction(parse(someJson))//无需指定
谢谢,我明白你关于违反定义的观点。可悲的是,我必须在Kotlin中重写旧的Java代码,并保持它们的兼容性。否则我会同意你的解决方案。尽管如此,2个函数还是比4个重载函数好。。