Json 我可以通过传递类型信息来简化它吗?
我有很多这样的代码,除了类型Json 我可以通过传递类型信息来简化它吗?,json,jackson,kotlin,Json,Jackson,Kotlin,我有很多这样的代码,除了类型PositionJson,它可以是AnotherJson或FooJson或BarJson 是否有某种方法可以将所有这些代码转换成一个函数,然后以某种方式将类型传递给它?这样我就不会有几个几乎相同的大代码块散落在我的课堂上了 我不确定这是否可能,只是想我会问,因为这样做会很好 /** * @return the _open_ [PositionJson]s */ val positions: Array<PositionJson
PositionJson
,它可以是AnotherJson
或FooJson
或BarJson
是否有某种方法可以将所有这些代码转换成一个函数,然后以某种方式将类型传递给它?这样我就不会有几个几乎相同的大代码块散落在我的课堂上了
我不确定这是否可能,只是想我会问,因为这样做会很好
/**
* @return the _open_ [PositionJson]s
*/
val positions: Array<PositionJson>?
@Throws(AccountsAPIException::class)
get() {
val service = constructServiceURL(POSITIONS, null, true)
try {
val messageJson = mapper.readValue<MessageJson<Array<PositionJson>>>(
callURL(service),
object: TypeReference<MessageJson<Array<PositionJson>>>() {
})
val error = messageJson.error
if (error != null) throw AccountsAPIException(error.errorCode, error.description)
return messageJson.data
} catch (e: Exception) {
throw AccountsAPIException(e)
}
}
/**
*@返回打开的位置
*/
val位置:数组?
@抛出(AccountSapieException::类)
得到(){
val service=constructServiceURL(位置,null,true)
试一试{
val messageJson=mapper.readValue(
callURL(服务),
对象:TypeReference(){
})
val error=messageJson.error
if(error!=null)抛出AccountSapieException(error.errorCode,error.description)
返回messageJson.data
}捕获(e:例外){
抛出AccountsAPIException(e)
}
}
您可以对泛型执行任何操作。然而,要使用泛型,我们首先需要将这一巨大的代码块提取到一个方法中:
val positions: Array<PositionJson>? get() = getPositions()
fun getPositions(): Array<PositionJson>? {
...
}
太好了!但由于类型擦除,这将无法编译。但是我们也可以通过使函数内联
并使类型参数具体化
来解决这个问题:
inline fun <reified T: Any> getArrayOf(): Array<T>? {
...
}
你可以用泛型做你想做的事。然而,要使用泛型,我们首先需要将这一巨大的代码块提取到一个方法中:
val positions: Array<PositionJson>? get() = getPositions()
fun getPositions(): Array<PositionJson>? {
...
}
太好了!但由于类型擦除,这将无法编译。但是我们也可以通过使函数内联
并使类型参数具体化
来解决这个问题:
inline fun <reified T: Any> getArrayOf(): Array<T>? {
...
}
我还注意到了
POSITIONS
变量,OP在最初的问题中没有调用该变量。也可以将其提取为函数调用的参数:getArrayOf(POSITIONS)
yesPOSITIONS
只是一个url片段,可以很容易地将其转换为参数。我似乎遇到了一个障碍,这行代码是object:TypeReference(){
-它产生了一个类型转换异常(java.lang.Object无法强制转换…
)-如果我将这一行中的T
替换为,例如PositionJson
,那么它可以工作-我该怎么办?我的意思是代码中的其他T
s都可以,只有这一个是problem@ycomp您的*Json
对象派生自哪个公共类?或者,编译器抱怨它不能强制转换到哪个类?让我们来看看假设类名是JsonBase
——更改您的泛型签名以要求T
是JsonBase
的子类:inline fun getArrayOf()
就是这样……它们只扩展了Object/Any(我的意思是在类定义中没有指定任何内容)。它抱怨强制转换到Objectjava.lang.Object不能强制转换…
-我想这没关系,但它们是Kotlin类-不是java类。我还注意到了POSITIONS
变量,OP在原始问题中没有调用它。这可能也可以作为函数ca的参数提取出来LH:getArrayOf(POSITIONS)
yesPOSITIONS
只是一个url片段,可以很容易地把它变成一个参数。我好像遇到了一个问题,这行代码object:TypeReference(){
-它产生了一个类型转换异常(java.lang.object不能被转换…
)-如果我将这一行中的T
替换为,例如PositionJson
,那么它可以工作-我该怎么办?我的意思是代码中的其他T
s都可以,只有这一个是problem@ycomp您的*Json
对象派生自哪个公共类?或者,编译器抱怨它不能强制转换到哪个类?让我们来看看假设类名是JsonBase
——更改您的泛型签名以要求T
是JsonBase
的子类:inline fun getArrayOf()
就是这样……它们只扩展了Object/Any(我的意思是在类定义中没有指定任何内容)。它抱怨强制转换为Objectjava.lang.Object不能强制转换…
-我想这没关系,但它们是Kotlin类-不是java类
val positions: Array<PositionJson>? = getArrayOf()
// this syntax would also work:
val positions = getArrayOf<PositionJson>()