Kotlin中的有什么不同?

下面的测试课,通过。

class SimpleClassTest { private inline fun  anyObject(): T { return Mockito.anyObject() } lateinit var simpleObject: SimpleClass @Mock lateinit var injectedObject: InjectedClass @Before fun setUp() { MockitoAnnotations.initMocks(this) } @Test fun testSimpleFunction() { simpleObject = SimpleClass(injectedObject) simpleObject.simpleFunction() verify(injectedObject).settingDependentObject(anyObject()) } } 

但如果我们改变

  private inline fun  anyObject(): T { return Mockito.anyObject() } 

  private inline fun  anyObject(): T { return Mockito.anyObject() } 

它会失败

 java.lang.IllegalStateException: Mockito.anyObject() must not be null 

Kotlin中的有什么不同?

UPDATED随着答案Any是非空的,那么使用不应该返回错误,因为settingDependentObject(...)被声明接收一个非空参数。 我希望应该出错,但是与我所理解的相反。

我明白了什么错吗?

2 Solutions collect form web for “Kotlin中的有什么不同?”

正如文档和链接的答案中所述,默认的上限是Any? 。 换句话说,下面的声明是等价的:

 inline fun  anyObject(): T = Mockito.anyObject() inline fun  anyObject(): T = Mockito.anyObject() 

Mockito.anyObject() 将为 T:AnyT:Any? 都返回null T:Any? 。 当返回types为T:Any被调用时,由Mockito返回的null值将失败由Kotlin编译器插入的运行时检查。 在调用settingDependentObject之前抛出错误。

在types参数上添加T : Any约束时,实际上使其非空: TAny子types, Any不能包含空值。

由于该函数是内联的,并且具有一个特定的types参数,所以该参数被替换为一个真正的非空types。 因此,在呼叫站点执行空检查,所以你得到这个例外。

  • 将parameter passing给kotlin中的自定义getter
  • Class.forName与Kotlin中的实例检查
  • Kotlin以声明作为expression
  • 如何把元素放到地图上并返回地图
  • InteliJ中的Kotlin多平台JVMtypes不匹配
  • Kotlin:为什么我不能使用我的一个function?
  • 将inheritance的Java bean转换为Kotlin
  • 用于构建gradle(1.1.2-5)的kotlin版本与捆绑到IDE插件(1.1.2-4)中的版本不同,
  • Kotlingenericstypes参数
  • 为什么我得到@提供注释错误?
  • Kotlin:如何在类中使用多个Generic?
  • Kotlin language will be the best programming language for Android.