Динамически создать тип возвращаемого значения - PullRequest
0 голосов
/ 29 сентября 2018

Я действительно новичок в 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 голосов
/ 29 сентября 2018

Типобезопасный способ добиться того, что вы хотите:

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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...