首页 > 解决方案 > 如何在 Kotlin 中创建具有特定类型参数的“类”实例?

问题描述

我有这个父类和这个子类:

abstract class ParentClass<T> {
    protected abstract val dataClass: Class<T>
}
class ChildClass<K, V> : ParentClass<Map<K, V>>() {
    override val dataClass: Class<Map<K, V>>
        get() = HashMap::class.java // compilation error, invalid return type
}

我希望子类实现 dataClass 成员,以便以后可以使用它来创建类型 T 的实例:

T data = dataClass.newInstance()

但是,我的 dataClass 实现的返回类型在此上下文中无效,因此无法编译:

Class<Map<K, V>> // required
Class<HashMap<*, *>> // found

有没有办法为 Class 实例指定类型参数,或者完全不同的解决方案来解决这个问题?我意识到我可以用 替换父成员Class<*>,但我想要类型安全的东西。

标签: kotlingenerics

解决方案


我刚刚将成员修改为一个函数以生成一个新实例,并添加了第二个惰性成员以通过创建一个临时实例来获取该类:

abstract class ParentClass<T : Any> {
    protected abstract fun createDataInstance(): T
    private val dataClass: Class<T> by lazy {
        createDataInstance()::class.java as Class<T>
    }
}
class ChildClass<K, V> : ParentClass<Map<K, V>>() {
    override fun createDataInstance(): Map<K, V> = HashMap()
}
// snippet (Java)
ChildClass<Integer, Integer> childClass = new ChildClass<>();
Map<Integer, Integer> instance = childClass.getDataInstance();
instance.put(0, 1);
System.out.println("Child instance #1: " + instance);
System.out.println("Child instance class " + childClass.getDataClass());
System.out.println("Child instance #2: " + childClass.getDataInstance());
// output (Java)
Child instance #1: {0=1}
Child instance class class java.util.HashMap
Child instance #2: {}

推荐阅读