在Kotlin中创建Spring的ParameterizedTypeReference实例

时间:2018-09-30 20:12:26

标签: spring-boot generics kotlin spring-test

我正在尝试学习Kotlin,并测试它在Spring Boot中如何工作。我的应用程序使用mongo数据库存储数据,我有一个Jersey资源来检索数据。我正在使用spring-boot-testRestTestTemplate进行测试。

RestTestTemplate具有一个exchange的{​​{1}}方法。此类具有受保护的构造函数。因此,我设法在Kotlin上使用它的唯一方法是:

ParameterizedTypeReference

这是我的测试方法:

class ListOfPeople : ParameterizedTypeReference<List<Person>>()

这是正确的(或唯一的)方法吗?还是有更好的方法?

如果有帮助,这里是整个测试的链接:testclass on github

2 个答案:

答案 0 :(得分:6)

虽然使用对象表达式的答案是正确的,并且与您在Java中的实现方式直接等效,但是如果需要许多ParameterizedTypeReference,则经过修饰的类型参数可以简化该表达式:

inline fun <reified T> typeReference() = object : ParameterizedTypeReference<T>() {}

// called as
restTemplate.exchange(requestEntity, typeReference<List<Person>>())

当编译器看到typeReference<SomeType>调用时,它将被定义替换,因此结果与您编写object : ParameterizedTypeReference<SomeType>() {}的结果相同。

答案 1 :(得分:3)

感谢JB Nizet向我指出了正确的文档。

val responseEntity : ResponseEntity<List<Person>> =
            restTemplate.exchange(requestEntity, 
            object: ParameterizedTypeReference<List<Person>> () {})

如果我没看错,这称为对象表达式。