TL; DR
Функция может иметь ровно 1 тип возвращаемого значения, но ваша функция имеет 2 разных типа возвращаемого значения.
Работает только это:
interface Interface<T>
class StringImplementation: Interface<String>
class BooleanImplementation: Interface<Boolean>
class Resolver {
fun resolve(implementation: String): Interface<*> { // <-- star
return when (implementation) {
"string" -> StringImplementation()
"boolean" -> BooleanImplementation()
else -> throw IllegalArgumentException()
}
}
}
Пояснение
С точки зрения определения функции, он должен иметь явный, ясный тип возврата. Interface<T>
говорит, что это должно быть что-то расширяющее Interface
и явный тип T
, конкретная реализация которого может быть известна по началу выполнения функции.
Там в вашем коде нет способа узнать, что будет T
, когда вы позвоните resolve
. Как еще вы вообразите, что функция будет знать, что она вернет?!
Сокращенно: функция может иметь ровно 1 тип возвращаемого значения, но ваша функция имеет 2 разных типа возвращаемых значений (Interface<String>
/ Interface<Boolean>
) .
Продолжайте читать здесь , если хотите углубиться в дженерики и получить более подробное техническое описание.