I am creating a TypeToken
-like system similar to what Gson has and I have stumbled upon something I do not understand.
这段代码的目的是只有一个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>())
}
This is the output:
testing.Single<java.util.HashMap<java.lang.Integer, java.lang.String>>
testing.Single<testing.Foo>
testing.Single<WHAT>
testing.Single<WHAT>
It looks like to me as if the Single<WHAT>
(sry for that generic name) does not get 'truly' inlined and some intermediate name gets generated.
I have also looked in the docs but I did not find examples regarding this.
How can I create what I initially intended to do? Why does this happen?
编辑.:
我想制造一个问题,但他们已经知道了.
一个非常相似的问题是发行here,据说是this的复制品.您也可以在后面的链接中投票.
供将来参考:此处使用Kotlin 1.2.50
.