kotlin - 如何在 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<*>
,但我想要类型安全的东西。
解决方案
我刚刚将成员修改为一个函数以生成一个新实例,并添加了第二个惰性成员以通过创建一个临时实例来获取该类:
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: {}
推荐阅读
- python - 具有多个标签的 Python Selenium XPATH
- csv - Fsharp CSV 解析
- php - 将 $variable 打印到 HTML 表格中
- android - 如何在 Android/IOS 上将 TIdTCPClient 连接到 TIdTCPServer?
- datagrip - 在 DataGrip 的所有表中搜索一个值
- c# - 如何创建一个简单的 MessageBox 替代品 (WPF)
- python - 编辑 Jupyter 终端的起始目录
- wordpress - 联系表格 7 - 在不填写和发送表格时禁用强制字段
- c# - ASP NET MVC CORE 2.2 - ViewComponent 的 Invoke() 奇怪地生成了 InvalidOperationException
- vuejs2 - VueJS资源在与其他项目一样的确切代码上抛出未定义的错误