如何满足Kotlin中Class <T>的嵌套泛型要求

时间:2019-09-11 08:28:49

标签: java generics kotlin

我正在尝试调用一个方法,该方法的签名中包含一个参数Class<T>

下面是kotlin中的示例代码

val response: ResponseEntity<ResponseObject<*>> = testRestTemplate.postForEntity("/users", user, ResponseObject::class.java)

我想要实现的是摆脱responseObject中的<*>而让它成为

val response: ResponseEntity<ResponseObject<User>> = ???

但是我不确定要提供什么正确的语法来满足Class<T>要求

我尝试过

ResponseObject<User::class.java>::class.java

但这不是有效的语法。有指针吗?

真正的问题是,如果我使用*,我不知道如何正确地从那里正确推断User实例。

3 个答案:

答案 0 :(得分:0)

好的,我设法使用when

通过类型转换解决了我的问题
@Test
    fun testCreateUser() {
        val user = User(id = null)
        val response = testRestTemplate.postForEntity("/users", user, ResponseObject::class.java)
        val responseObject = response.body
        when (val returnedUser = responseObject.model) {
            is User -> {
                assertNotNull(returnedUser.id)
                assertEquals(UserStatus.active, returnedUser.status)
            }
        }
    }

答案 1 :(得分:0)

如果您可以更改方法的签名,则可以尝试执行以下操作:

class ResponseEntity<T : Any>(val body: T)

class ResponseObject<T : Any>(val model: T)

data class User(val id: Long, val status: String)

fun <M : Any, K : ResponseObject<M>> postForEntity(paht: String, model: M): ResponseEntity<K> {
    return TODO()
}

val response: ResponseEntity<ResponseObject<User>> = postForEntity("/users", User(1, "good"))

答案 2 :(得分:0)

您可以使用

@Suppress("UNCHECKED_CAST")
val response = testRestTemplate.postForEntity("/users", user, ResponseObject::class.java as Class<ResponseObject<User>>)

如果需要针对不同的参数多次使用,则可以使用辅助功能

inline fun <reified T> classOf<T>() = T::class.java

val response = testRestTemplate.postForEntity("/users", user, classOf<ResponseObject<User>>())

(在两种情况下都应推断类型ResponseEntity<ResponseObject<User>>