检查具体化的类是 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 翻译):

  1. 检查一个类是否是父类的子类:

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")
    }
}

  1. 找到一个类类型,然后检查类型 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 函数仍处于试验阶段。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...