您可以将对象动态转换为类吗?

时间:2019-09-06 17:47:39

标签: android kotlin reflection casting

我想根据对象的其中一个字段来投射对象,该字段将具有该对象的正确值。

例如

object as object.class

object.class等同于一个类,例如Int或任何其他kotlin类。

有可能吗?

2 个答案:

答案 0 :(得分:0)

是的,如果您的Required类扩展了基类

(list.get(pos) as Class).requeiedfunction

答案 1 :(得分:0)

使用预期的接口和BaseClass,可以根据需要使用类型安全性来实现此目的。这是使用对象作为输入,但是按照这种模式,任何类型的实例都可以工作。

该界面强制分配类型,并且可以让您在没有任何魔术的情况下将Type保持在范围内。它使您可以轻松处理所有预期的情况。

interface ClassCast<out T> {
    val type: T
}

open class MyClassBase
class MyClassOne : MyClassBase()
class MyClassTwo : MyClassBase()
class LonerClass

val myObjOne = object : ClassCast<MyClassBase> {
    override val type = MyClassOne()
}

val myObjTwo = object : ClassCast<MyClassBase> {
    override val type = MyClassTwo()
}

val nonRelatedObj = object : ClassCast<LonerClass> {
    override val type = LonerClass()
}

fun castToClass(item: ClassCast<Any>): Any {
    return when (item.type) {
        is MyClassOne -> {
            println("We have an Instance of class one")
            MyClassOne()
        }
        is MyClassTwo -> {
            println("We have an Instance of class two")
            MyClassTwo()
        }
        is LonerClass -> {
            println("Class that doesnt inherit from base type")
            LonerClass()
        }
        else -> {
            println("Unexpected type: $item")
            throw Exception("Unexpected type cant be cast")
        }
    }
}

castToClass(myObjOne) // Prints: "We have an Instance of class one"
castToClass(myObjTwo)) // Prints: "We have an Instance of class two"
castToClass(nonRelatedObj) // Prints: "Class that doesnt inherit from base type"