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)
yes
POSITIONS
只是一个url片段,可以很容易地将其转换为参数。我似乎遇到了一个障碍,这行代码是
object:TypeReference(){
-它产生了一个类型转换异常(
java.lang.Object无法强制转换…
)-如果我将这一行中的
T
替换为,例如
PositionJson
,那么它可以工作-我该怎么办?我的意思是代码中的其他
T
s都可以,只有这一个是problem@ycomp您的
*Json
对象派生自哪个公共类?或者,编译器抱怨它不能强制转换到哪个类?让我们来看看假设类名是
JsonBase
——更改您的泛型签名以要求
T
JsonBase
的子类:
inline fun getArrayOf()
就是这样……它们只扩展了Object/Any(我的意思是在类定义中没有指定任何内容)。它抱怨强制转换到Object
java.lang.Object不能强制转换…
-我想这没关系,但它们是Kotlin类-不是java类。我还注意到了
POSITIONS
变量,OP在原始问题中没有调用它。这可能也可以作为函数ca的参数提取出来LH:
getArrayOf(POSITIONS)
yes
POSITIONS
只是一个url片段,可以很容易地把它变成一个参数。我好像遇到了一个问题,这行代码
object:TypeReference(){
-它产生了一个类型转换异常(
java.lang.object不能被转换…
)-如果我将这一行中的
T
替换为,例如
PositionJson
,那么它可以工作-我该怎么办?我的意思是代码中的其他
T
s都可以,只有这一个是problem@ycomp您的
*Json
对象派生自哪个公共类?或者,编译器抱怨它不能强制转换到哪个类?让我们来看看假设类名是
JsonBase
——更改您的泛型签名以要求
T
JsonBase
的子类:
inline fun getArrayOf()
就是这样……它们只扩展了Object/Any(我的意思是在类定义中没有指定任何内容)。它抱怨强制转换为Object
java.lang.Object不能强制转换…
-我想这没关系,但它们是Kotlin类-不是java类
val positions: Array<PositionJson>? = getArrayOf()
// this syntax would also work:
val positions = getArrayOf<PositionJson>()