动态创建返回类型

时间:2018-09-29 02:03:10

标签: kotlin

我真的不是Kotlin的新手,主要使用Javascript进行编码,但是我希望了解是否可以在维持静态分析的同时动态创建类型。 这就是我想要实现的目标。

    class TestOne {
     def one(){
       print('function one');
     }
    }

    class TestTwo {
     def two() {
       print('function two');
     }
    }

workItOut("TestOne").one() // prints "function one"
workItOut("TestTwo").two() // prints "function two"

workItOut函数将使用字符串并创建类

fun workItOut(name: String) {
        if(name.equals("TestOne"))
            return TestOne()
        else if(name.equals("TestTwo"))
            return TestTwo()

        return ""
    }

1 个答案:

答案 0 :(得分:3)

实现您想要的类型安全的方法是:

interface DoSomething {
    fun foo()
}

class TestOne : DoSomething {
    override fun foo() {
        println("function one")
    }
}

class TestTwo : DoSomething {
    override fun foo() {
        println("function two")
    }
}

fun workItOut(name: String): DoSomething {
    return when (name) {
        "TestOne" -> TestOne()
        "TestTwo" -> TestTwo()
        else -> throw IllegalStateException("Invalid type identifier $name")
    }
}

workItOut("TestOne").foo()
workItOut("TestTwo").foo()

非类型安全(和邪恶,非Kotlin,非静态类型)的方式是使用不安全的强制类型转换,并告诉函数您期望得到什么结果(您似乎知道什么)期望是因为您正在呼叫one()two()):

class TestOne {
    fun one() {
        println("function one")
    }
}

class TestTwo {
    fun twpo {
        println("function two")
    }
}

@Suppress("UNCHECKED_CAST")
fun <T: Any> workItOut(name: String): T {
    return when (name) {
        "TestOne" -> TestOne() as T
        "TestTwo" -> TestTwo() as T
        else -> throw IllegalStateException("Invalid type identifier $name")
    }
}

workItOut<TestOne>("TestOne").one()
workItOut<TestTwo>("TestTwo").two()