我有一个函数可以根据传递的参数返回通用类型,但是我无法设置其默认值。这是我的示例功能:
fun <T : BaseClass> parse(json: String, gson: Class<T> = BaseClass::class): T =
Gson().fromJson(json, gson)
但是,我得到默认参数的类型不匹配错误:预期Class<T>
,发现Class<BaseClass>
。
我可以使用第二个功能实现相同的目的:
fun <T : BaseClass> parse(json: String, gson: Class<T>): T =
Gson().fromJson(json, gson)
fun BaseClass parse(json: String) =
parse(json, BaseClass::class)
看上去不像科特林那样。是否可以使用默认的通用参数?谢谢。
答案 0 :(得分:3)
您的第一行代码在实践中将不可用。如果执行此操作会怎样?
class Derived: BaseClass()
val x = parse<Derived>(someJson)
这将违反其对泛型类型的定义。
您的上述解决方案对于您的用例可能是最好的。您可能还会考虑使用类似以下的修饰类型:
inline fun <reified T : BaseClass> parse(json: String): T =
Gson().fromJson(json, T::class)
这没有为您提供任何默认值,但是它允许编译器在可能的情况下推断类型,因此在某些情况下,您不必指定类:
fun someFunction(derived: Derived) {
//...
}
someFunction(parse(someJson)) // no need to specify <Derived>