Generics Kotlin具体化的泛型没有按计划保留类型
我正在创建一个类似于Gson的Generics Kotlin具体化的泛型没有按计划保留类型,generics,kotlin,kotlin-reified-type-parameters,Generics,Kotlin,Kotlin Reified Type Parameters,我正在创建一个类似于Gson的TypeToken系统,我偶然发现了一些我不理解的东西 这段代码的意图是只有一个TypeReference类具有一个可以容纳多个泛型参数的泛型参数。该类将使用inline函数创建,这样用户就不需要知道Holder类 请考虑下面的代码: package testing import java.lang.reflect.ParameterizedType import java.lang.reflect.Type abstract class TypeReferen
TypeToken
系统,我偶然发现了一些我不理解的东西
这段代码的意图是只有一个TypeReference
类具有一个可以容纳多个泛型参数的泛型参数。该类将使用inline
函数创建,这样用户就不需要知道Holder
类
请考虑下面的代码:
package testing
import java.lang.reflect.ParameterizedType
import java.lang.reflect.Type
abstract class TypeReference<T : Holder> {
val type: Type = (javaClass.genericSuperclass as ParameterizedType).actualTypeArguments[0]
override fun toString(): String {
return type.typeName
}
}
inline fun <reified T : Holder> create() = object : TypeReference<T>() {}
inline fun <reified WHAT> createSingle() = object : TypeReference<Single<WHAT>>() {}
class Foo
interface Holder
interface Single<T> : Holder
fun main(args: Array<String>) {
println(create<Single<HashMap<Int, String>>>())
println(create<Single<Foo>>())
println(createSingle<HashMap<Int, String>>())
println(createSingle<Foo>())
}
包测试
导入java.lang.reflect.ParameterizedType
导入java.lang.reflect.Type
抽象类类型引用{
val类型:类型=(javaClass.genericSuperclass作为ParameterizedType)。actualTypeArguments[0]
重写funtostring():String{
返回type.typeName
}
}
inline fun create()=对象:TypeReference(){}
inline fun createSingle()=对象:TypeReference(){}
福班
接口保持器
接口单:支架
趣味主线(args:Array){
println(create())
println(create())
println(createSingle())
println(createSingle())
}
这是输出:
testing.Single<java.util.HashMap<java.lang.Integer, java.lang.String>>
testing.Single<testing.Foo>
testing.Single<WHAT>
testing.Single<WHAT>
testing.Single
测试。单人
测试。单人
测试。单人
在我看来,似乎单个
(该通用名称的sry)没有“真正”内联,并且生成了一些中间名称
我也看过了,但我没有找到这方面的例子
如何创建我最初打算做的事情?为什么会发生这种情况
编辑:
我想制造一个问题,但他们已经知道了
发行了一个非常类似的版本,据说是该版本的副本。你也可以在后面的链接中投票
作为将来的参考:
Kotlin 1.2.50
在这里使用。我反编译了这段代码,发现两个函数之间有些不同
private static final TypeReference create() {
Intrinsics.needClassReification(); <---- here
return (TypeReference)(new TypeReference() {
});
}
private static final TypeReference createSingle() {
return (TypeReference)(new TypeReference() {
});
}
private static final TypeReference create(){
Intrinsics.needClassRefication();您应该解决您的问题。您有一个Foo
类,它突然显示为TestClass
。是的,对。相应地编辑了问题。奇怪的是,create
运行,但createSingle
抛出一个“由于web游乐场中的安全原因导致访问控制异常”@AlexeyRomanov很容易在本地复制,只需在顶部添加System.setSecurityManager(SecurityManager())
。它在TypeReference.
中失败。如果您还没有报告错误,我建议您报告一个错误。特别是@tiiime的答案。
inline fun <reified WHAT > createSingle() = Intrinsics.needClassReification().let {
object : TypeReference<Single<WHAT>>() {}
}
Single<java.util.HashMap<java.lang.Integer, java.lang.String>>
Single<Foo>
Single<java.util.HashMap<java.lang.Integer, java.lang.String>>
Single<Foo>