如何解决检查具体化的类是 Parcelable 还是 Serializable
我需要检查请求的 Arg
类型以选择反序列化方法。
inline fun <reified Arg : Any?> Fragment.navArgParser(
crossinline parcelCreatorProducer: () -> Parcelable.Creator<Arg>
) = NavArgsLazy<Arg?>({
arguments ?: throw IllegalStateException("Fragment $this has null arguments")
}) {
when {
Arg is Parcelable -> // ISSUE
NavArgParser.deserializeData<Arg>(it,parcelCreatorProducer.invoke())
Arg is Serializable -> // ISSUE
NavArgParser.deserializeData<Serializable>(it) as Arg
else ->
throw IllegalStateException("${Arg::class.java.simpleName} must implement Parcelable or Serializable")
}
}
如何检查 Arg 是 Parcelable 还是 Serializable?
解决方法
Arg 不是对象,因此您不能使用 is
。您应该使用接受类对象的 isAssignableFrom
when {
Parcelable::class.java.isAssignableFrom(Arg::class.java) -> //
...
}
您还可以编写一些扩展程序,例如:
inline fun <reified L : Any,reified R : Any> isSubClassOf() = R::class.java.isAssignableFrom(L::class.java)
inline fun <reified L : Any,reified R : Any> isSuperClassOf() = L::class.java.isAssignableFrom(R::class.java)
然后像这样使用
when{
isSuperClassOf<Parcelable,Arg> -> //
,
纯粹在 Kotlin 中有两种检查类型相等的方法(没有 Java 翻译):
- 检查一个类是否是父类的子类:
inline fun <reified A> checkSubclasses(){
if(A::class.isSubclassOf(Serializable::class)){
println("it's a serializable")
}
if(A::class.isSubclassOf(Parcelable::class)){
println("it's a parcelable")
}
}
- 找到一个类类型,然后检查类型 A 是否是 B 的子类型:
@ExperimentalStdlibApi
inline fun <reified A> checkType() {
val argType = typeOf<A>()
if(argType.isSubtypeOf(typeOf<Serializable>())){
println("it's a serializable")
} else if (argType.isSubtypeOf(typeOf<Parcelable>())){
println("it's a parcelable")
}
}
typeOf
可以在更多情况下使用
请注意,typeOf
函数仍处于试验阶段。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。