Generics Kotlin具体化的泛型没有按计划保留类型

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

我正在创建一个类似于Gson的
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>