Типобезопасный способ добиться того, что вы хотите:
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()
Нетипобезопасный ( и злой, не котлинский, нестатический тип ) состоит в использованиинебезопасное приведение и скажите функции, какой результат вы ожидаете получить (кажется, вы знаете, чего ожидать, потому что вы звоните 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()