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 - Fatal编程技术网

Kotlin 如何从类型名中获取类名?

Kotlin 如何从类型名中获取类名?,kotlin,Kotlin,我试图使用Jackson和Kotlin将Json字符串反序列化为类型为OperationResult的对象 我需要像这样构造一个类型对象: val mapper : ObjectMapper = ObjectMapper(); val type : JavaType = mapper.getTypeFactory() .constructParametricType(*/ class of OperationResult */,, /* class of

我试图使用Jackson和Kotlin将Json字符串反序列化为类型为
OperationResult
的对象

我需要像这样构造一个类型对象:

val mapper : ObjectMapper = ObjectMapper();
val type : JavaType = mapper.getTypeFactory()
         .constructParametricType(*/ class of OperationResult */,, 
          /* class of String */);
val result : OperationResult<String> = mapper.readValue(
                  responseString, type);
val映射器:ObjectMapper=ObjectMapper();
val type:JavaType=mapper.getTypeFactory()
.ConstructParameterType(*/OperationResult类*/,),,
/*字符串类*/);
val结果:OperationResult=mapper.readValue(
负责人(类型);
我试过以下方法,但都不管用

val type : JavaType = mapper.getTypeFactory()
            .constructParametricType(
             javaClass<OperationResult>, 
             javaClass<String>); // Unresolved javaClass<T>

val type : JavaType = mapper.getTypeFactory()
            .constructParametricType(
             OperationResult::class, 
             String::class);
val-type:JavaType=mapper.getTypeFactory()
.参数类型(
javaClass,
javaClass);//未解析的javaClass
val type:JavaType=mapper.getTypeFactory()
.参数类型(
OperationResult::类,
字符串::类);

如何从类型名称中获取java类?

以下操作与预期一样有效:

val type = mapper.typeFactory.constructParametricType(OperationalResult::class.java, String::class.java)
val operationalResult = mapper.readValue<OperationalResult<String>>("""{"result":"stack"}""", type)
println(operationalResult.result) // -> stack
val type=mapper.typeFactory.ConstructParameterType(OperationalResult::class.java,String::class.java)
val operationalResult=mapper.readValue(“{”结果“:“堆栈”}”,类型)
println(operationalResult.result)/>堆栈
反序列化泛型类型的更简单的替代方法是使用:

val operationalResult=mapper.readValue(“{”结果“:“5.5”}”),
对象:TypeReference(){})
println(operationalResult.result)/->5.5
在计算机的帮助下,你甚至可以写:

val operationalResult = mapper.readValue<OperationalResult<Long>>("""{"result":"5"}""")
println(operationalResult.result)
val operationalResult=mapper.readValue(“{”结果“:“5”}”)
println(operationalResult.result)

以下各项按预期工作:

val type = mapper.typeFactory.constructParametricType(OperationalResult::class.java, String::class.java)
val operationalResult = mapper.readValue<OperationalResult<String>>("""{"result":"stack"}""", type)
println(operationalResult.result) // -> stack
val type=mapper.typeFactory.ConstructParameterType(OperationalResult::class.java,String::class.java)
val operationalResult=mapper.readValue(“{”结果“:“堆栈”}”,类型)
println(operationalResult.result)/>堆栈
反序列化泛型类型的更简单的替代方法是使用:

val operationalResult=mapper.readValue(“{”结果“:“5.5”}”),
对象:TypeReference(){})
println(operationalResult.result)/->5.5
在计算机的帮助下,你甚至可以写:

val operationalResult = mapper.readValue<OperationalResult<Long>>("""{"result":"5"}""")
println(operationalResult.result)
val operationalResult=mapper.readValue(“{”结果“:“5”}”)
println(operationalResult.result)

您需要获取
而不是
KClass
的实例。要获得它,只需使用
::class.java
而不是
::class

val type : JavaType = mapper.typeFactory.constructParametricType(OperationResult::class.java, String::class.java)

您需要获取
Class
而不是
KClass
的实例。要获得它,只需使用
::class.java
而不是
::class

val type : JavaType = mapper.typeFactory.constructParametricType(OperationResult::class.java, String::class.java)

当使用Jackson、GSON或其他实例化Kotlin对象的库时,Kotlin有一些问题会引起关注。一是如何获得
TypeToken
TypeReference
或其他一些库想要了解的专门类。另一个问题是如何构造不总是具有默认构造函数或不可变的类

对于Jackson,专门构建了一个模块来涵盖这些案例。@miensol的回答中提到了这一点。他举了一个类似的例子:

import com.fasterxml.jackson.module.kotlin.*  // added for clarity

val operationalResult: OperationalResult<Long> = mapper.readValue(""{"result":"5"}""")
您可以很容易地编写相同的代码,但是模块中有大量这样的助手来为您完成这项工作。此外,它还能够为您调用非默认构造函数和静态工厂方法。在Jackson 2.8.+中,它还可以更智能地处理nullability和默认方法参数(允许JSON中缺少值,因此使用默认值)。如果没有模块,您很快就会发现新的错误

至于使用
mapper.typeFactory.constructParameterType
,您应该使用
TypeReference
,它更简单,并且遵循与上面相同的模式

val myTypeRef = object: TypeReference<SomeOtherClass>() {}
val myTypeRef=object:TypeReference(){}
此代码(通过)创建一个类的匿名实例,该类的超级类型为
typereference
,并指定了泛型类。Java反射可以查询这些信息

直接使用
Class
时要小心,因为它会删除泛型类型信息,因此使用
SomeOtherClass::Class
SomeOtherClass::Class.java
都会丢失泛型,对于需要了解泛型的事情,应该避免使用


因此,即使你不使用Jackson Kotlin模块也能侥幸逃脱,你很快就会遇到很多麻烦。本模块不必损坏Kotlin,而是可以删除这些类型的错误,并让您以“Kotlin方式”完成更多工作。

Kotlin在使用Jackson、GSON或其他实例化Kotlin对象的库时,有一些问题会引起关注。一是如何获得
TypeToken
TypeReference
或其他一些库想要了解的专门类。另一个问题是如何构造不总是具有默认构造函数或不可变的类

对于Jackson,专门构建了一个模块来涵盖这些案例。@miensol的回答中提到了这一点。他举了一个类似的例子:

import com.fasterxml.jackson.module.kotlin.*  // added for clarity

val operationalResult: OperationalResult<Long> = mapper.readValue(""{"result":"5"}""")
您可以很容易地编写相同的代码,但是模块中有大量这样的助手来为您完成这项工作。此外,它还能够为您调用非默认构造函数和静态工厂方法。在Jackson 2.8.+中,它还可以更智能地处理nullability和默认方法参数(允许JSON中缺少值,因此使用默认值)。如果没有模块,您很快就会发现新的错误

至于使用
mapper.typeFactory.constructParameterType
,您应该使用
TypeReference
,它更简单,并且遵循与上面相同的模式

val myTypeRef = object: TypeReference<SomeOtherClass>() {}
val myTypeRef=object:TypeReference(){}
此代码(通过)创建一个类的匿名实例,该类的超级类型为
typereference