我即将使我的一项服务通用化。然而,当我试图将一个泛型Kotlin类型T
传递给一个需要类的Java方法时,我没有做到这一点。使用普通类型,我会像MyClass::class.java
一样执行。对于泛型类型,我执行T::class.java
。然而,这似乎是无效的。
Cannot use 'T' as reified type parameter. Use a class instead.
此处发生return mongoTemplate.aggregate(resolvedDocument, T::class.java).mappedResults[0]
服务:
@Service
class DocumentAggregator<T: Output>(
@Autowired
private val mongoTemplate: MongoTemplate
) {
fun <S: DocumentEntity>aggregate(document: S): T? {
val resolvedDocument: TypedAggregation<DocumentEntity> = // logic
return mongoTemplate.aggregate(resolvedDocument, T::class.java).mappedResults[0]
}
}
您应该尝试将reified
关键字添加到泛型参数中,如下所示:
class DocumentAggregator<reified T: Output>
这样类就会在运行时出现。就像添加了一个额外的Class<T>
参数一样,只需使用漂亮的Kotlin语法糖。
编辑:关于注释,问题是您是否需要类上的泛型。编译的内容(感谢Willie指出错误(将是:
class Output
class DocumentAggregator(
private val mongoTemplate: Any?
) {
inline fun <S, reified T: Output>aggregate(document: S): T? {
return null
}
}