为什么我必须投入Kotlin而不是Java?

LEO*_*LEO 2 java kotlin

问题:为什么我必须在Kotlin中输入类型而不是在Java中?

我有一个java方法:

processAction(Observable<Action> actions)
Run Code Online (Sandbox Code Playgroud)

我在测试(Java)中调用它:

when(myMock.processAction(any(Observable.class))).thenAnswer(...)
Run Code Online (Sandbox Code Playgroud)

我把它叫做测试(Kotlin):

when(myMock.processAction(any(Observable::class.java) as Observable<Action>).thenAnswer(...)
Run Code Online (Sandbox Code Playgroud)

回购这里

Oli*_*rth 6

在Java中,表达式具有以下类型:

  • Observable.class - > Class<Observable>
  • any(Observable.class) - > Observable

同样在Kotlin:

  • Observable::class.java - > Class<Observable<*>>
  • any(Observable::class.java) - > Observable<*>

在Java中,Observable是一种原始类型; 您应该期望您的编译器/ IDE在隐式转换为时突出显示警告Observable<Action>.为了与pre-generics世界向后兼容,这无法编译.

Kotlin试图更聪明地处理泛型,以及向后兼容性的东西不适用.所以它迫使你在这里明确你的意图.


在切线上,如果你在Kotlin中使用Mockito,我强烈推荐使用Mockito-Kotlin绑定,因为它们使得这一点大大减少(any()在这种情况下就是这样).