次のインターフェースがあるとします。
interface Fooable {
fun foo()
}
インターフェイスは、名前付きコンパニオン オブジェクトによって実装されます。例えば:
class Impl1 {
companion object Foo : Fooable {
fun foo() { ... }
}
}
class Impl2 {
companion object Foo : Fooable {
fun foo() { ... }
}
}
各Implクラスの名前をインスタンスにマップできるようにしたいFooable(コンパニオン オブジェクトは常にシングルトン インスタンスであるため)。例えば:
fun mapImplToFooable(): Map<String, Fooable> = mapOf(
"Impl1" to Impl1.Foo,
"Impl2" to Impl2.Foo
)
これを呼び出すことができます。例えば:
val map = mapImplToFooable()
map["Impl1"]!!.foo()
私が望むのは、ハードコーディングするのではなく、リフレクションを使用してマップを作成できるようにすることです。companion object Foo : Fooable { ... }
私がこれまでに持っているのは、パッケージ内のすべてのクラスとサブパッケージを見つけることができる関数です:
fun findAllClasses(): List<Class<*>> { ... }
そして、それから、私はここまで到達することができました:
function mapImplToFooable(): Map<String, Fooable> {
return findAllClasses()
.filter { Fooable::class.java.isAssignableFrom(it) }
.map { clazz -> it.name to clazz } // This is a problem...
.toMap()
問題は、 (いずれの場合もコンパニオン オブジェクト)のインスタンスでclazzはClass<Fooable>なく、それであるということです。Fooable
だけではなく、コンパニオン オブジェクトのインスタンスを取得するにはどうすればよいClass<Fooable>ですか?