Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Generics Kotlin函数返回值的默认通用参数_Generics_Kotlin - Fatal编程技术网

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个重载函数好。。