我正在尝试调用一个方法,该方法的签名中包含一个参数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
实例。
答案 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>>
)