我真的不是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 ""
}
答案 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()