Я хочу создать фабрику объектов с универсальным параметром:
interface Foo<T> {
fun buzz(param: T)
}
У меня есть две реализации для тестов:
class FooImpl1 : Foo<String> {
override fun buzz(param: String) {
// implementation 1
}
}
class FooImpl2 : Foo<Int> {
override fun buzz(param: Int) {
// implementation 2
}
}
Теперь я создал карту, которая будет содержать все мои реализации
val implementationMap = mapOf<String, Foo<*>>(
Pair(firstKey, FooImpl1()),
Pair(secKey, FooImpl2())
)
также у меня есть карта с параметрами:
val paramMap = mapOf<String, Any>(
Pair(firstKey, "String param"),
Pair(secKey, 12)
)
но теперь, когда я выбираю первый элемент с моей карты:
implementationMap.getValue(firstKey).buzz(paramMap.getValue(firstKey))
my buzz
метод отклоняет любой параметр (хочет Nothing
как тип)
Итак, я создал еще одну карту с типами
val classMap = mapOf<String, KClass<*>>(
Pair(firstKey, FooImpl1::class),
Pair(secKey, FooImpl2::class)
)
val paramClassMap = mapOf<String, KClass<*>>(
Pair(firstKey, String::class),
Pair(secKey, Int::class)
)
Но я не могу разыграть это так:
implementationMap.getValue(firstKey)
.cast < classMap.getValue(firstKey) > () // not possible
.buzz(
paramMap.getValue(firstKey)
.cast < paramClassMap.getValue(firstKey) > () // not possible
)
или что
(implementationMap.getValue(firstKey) // FooImpl1
/*not possible */ as classMap.getValue(firstKey)) // (FooImpl1::class)
.buzz(
paramMap.getValue(firstKey) // String
/*not possible */ as paramClassMap.getValue(firstKey)) // (String::class)
Я также пытался использовать тип Token
, но это не помогло:
val classMap = mapOf<String, Type>(
Pair(firstKey, object: TypeToken<FooImpl1>() {}.type),
Pair(secKey, object: TypeToken<FooImpl1>() {}.type)
)
Есть идеи, как правильно его разыграть? Или идеи "другого подхода"?