问题:为什么我必须在Kotlin中而不是在Java中强制转换类型?
我有一个Java方法:
processAction(Observable<Action> actions)
我在测试中将其称为(Java):
when(myMock.processAction(any(Observable.class))).thenAnswer(...)
我在测试中称它为(Kotlin)
when(myMock.processAction(any(Observable::class.java) as Observable<Action>).thenAnswer(...)
答案 0 :(得分:6)
在Java中,您的表达式具有以下类型:
Observable.class
-> Class<Observable>
any(Observable.class)
-> Observable
就像科特林一样:
Observable::class.java
-> Class<Observable<*>>
any(Observable::class.java)
-> Observable<*>
在Java中,Observable
是原始类型;当您隐式转换为Observable<Action>
时,应该期望您的编译器/ IDE突出显示警告。为了与前泛型世界向后兼容,这不会编译。
Kotlin试图更加聪明地处理泛型,而且不向后兼容。因此,这迫使您在此明确自己的意图。
在切线上,如果您在Kotlin中使用Mockito,我强烈建议您使用Mockito-Kotlin bindings,因为这样会使它们的冗长程度大大降低(本例中为any()
)。