Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Kotlin 从非具体化类型参数实例化类_Kotlin_Generics_Orm_Spring Data_Jasync Sql - Fatal编程技术网

Kotlin 从非具体化类型参数实例化类

Kotlin 从非具体化类型参数实例化类,kotlin,generics,orm,spring-data,jasync-sql,Kotlin,Generics,Orm,Spring Data,Jasync Sql,我正在构建一个用于Kotlin的ORM,但有一个基本问题我无法解决。我认为可以归结为: 给定一个 非具体化类型参数T 众所周知,您可以在其crudepository界面中看到它,该界面使用类型参数T进行参数化,并公开返回类型T实例的方法。我已经查看了源代码,但没有太大成功,但是在某个地方它必须能够在运行时实例化T类型的类,尽管T正在被擦除 当我查看自己的AbstractRepositoryabstract类时,我无法确定如何获取对t构造函数的引用,因为它需要访问t::class.construc

我正在构建一个用于Kotlin的ORM,但有一个基本问题我无法解决。我认为可以归结为:

给定一个 非具体化类型参数
T

众所周知,您可以在其
crudepository
界面中看到它,该界面使用类型参数
T
进行参数化,并公开返回类型
T
实例的方法。我已经查看了源代码,但没有太大成功,但是在某个地方它必须能够在运行时实例化
T
类型的类,尽管
T
正在被擦除


当我查看自己的
AbstractRepository
abstract类时,我无法确定如何获取对
t
构造函数的引用,因为它需要访问
t::class.constructors
,除非
t
是一个具体化的类型,否则构造函数的失败是可以理解的。考虑到只能在内联函数的参数中使用具体化类型,我有点不知道这是如何工作的?

在您自己的Crudepository中,您可以添加一个带有内联函数的伴随对象,该函数负责通过向存储库传递相应的类来实例化存储库

类MyCrudepository受保护构造函数(
私有val类型:类,
) {
伴星{
内联函数()=mycrudepository(T::class.java)
}
fun createTypeInstance()=type::class.createInstance()
}

在JVM上,对象的运行时类型会被擦除,但类上的泛型类型不会被擦除。因此,如果使用具体的专门化,可以使用反射来检索类型参数:

import java.lang.reflect*
​
抽象类抽象存储库
​
@抑制(“未选中的_CAST”)
有趣的类。repositoryType():类=
生成序列(此){
(它作为?类?:(它作为?参数化类型?.rawType作为?类)
?泛型超类
}
.filterIsInstance()
.first{it.rawType==AbstractRepository::class.java}
.actualTypeArguments
.single()作为类
​
类IntRepository:AbstractRepository()
类StringRepository:AbstractRepository()
接口Foo
类FooRepository:AbstractRepository()
分类栏
类:AbstractRepository()
​
主要内容(){
println(IntRepository::class.java.repositoryType())
println(StringRepository::class.java.repositoryType())
println(FooRepository::class.java.repositoryType())
println(BarRepository::class.java.repositoryType())
}

我考虑过类似的东西(即工厂函数),但不幸的是,我的存储库是一个抽象类,因为我希望能够根据需要向存储库添加功能。我想不出一种方法来使用这种模式来实现这个功能。为什么不能将函数内联呢?
class java.lang.Integer
class java.lang.String
interface Foo
class Bar