当前位置: 首页 > 知识库问答 >
问题:

Kotlin如何推断Java方法参数的可空性?

顾磊
2023-03-14

我试图调用Java方法org。springframework。数据mongodb。果心查询从Kotlin代码更新#set。此方法声明为

public Update set(String key, Object value)

没有关于参数可空性的附加注释或注释。事实上,它只是将放入哈希映射,因此有效地可能是空值

但是,Kotlin编译器将value类型视为Any(而不是预期的Any!),并在使用传递null时失败

Null can not be a value of a non-null type Any

通过传递可为空的值 明显导致KotlinNullPointerException,将强制转换为任何引发TypeCastException

这种可空性推断背后的逻辑是什么?通过反射传递null参数实际上效果很好,但有更自然的解决方案吗?


共有1个答案

郭瀚海
2023-03-14

这是由包的package-info.java中的注释引起的:

@org.springframework.lang.NonNullApi
package org.springframework.data.mongodb.core.query;

那是

一个通用的Spring注释,声明参数和返回值在默认情况下对于给定的包是不可为空的...静态编程语言用来推断Spring API的可为空性

 类似资料:
  • 我需要 Kotlin 中的一个集合来仅包含实现给定接口的元素。 例如:包含动物集合的地图: 通过阅读文档、博客和SO问题,我编写了使用Generics in关键字的代码: 现在我想在Test类中添加一个读取“data”内容的方法,例如将其打印到控制台: 如果我这样做,我会遇到编译错误: 我的解决方案是强制我的动物进入一个ArrayList 但是我不确定这是编写这种代码的最好方式。有没有更好的方式告

  • 我使用一个密封类从网络返回数据。但是当我在构建这个项目时,我得到了以下错误 类型推断失败:没有足够的信息来推断参数T in fun error(错误消息:String,错误:Throwable):状态请明确指定它。 我错过了什么? 这是代码

  • 在具体实际开发过程中,有时方法中参数的个数是不确定的。为了解决这个问题,在 J2SE 5.0 版本中引入了可变参数的概念。 声明可变参数的语法格式如下: 其中,methodName 表示方法名称;paramList 表示方法的固定参数列表;paramType 表示可变参数的类型;… 是声明可变参数的标识;paramName 表示可变参数名称。 注意:可变参数必须定义在参数列表的最后。 例 1 每次

  • 我读了一篇关于使用选项作为方法参数的文章,大家一致认为永远不要使用选项作为方法参数。 Guava可选作为可选参数的方法参数 这种使用作为方法参数的情况合法吗?如果不是,我如何使这是可列举的?

  • 如果我有两个具有相同签名的方法,仅根据vararg类型变化,Java如何知道在我不使用参数或传递null时调用哪个方法? 例如,如果我有以下两种方法: 我打电话给: 输出是“字符串args”。为什么Java决定在这里调用第二个方法而不是第一个方法?我很难找到描述这一点的规范的相关部分。

  • 问题内容: 下面的方法完美无瑕 但是我没有指定此方法中的 是什么。编译器如何将 方法返回的值分配给 未指定类型i 的变量? 我只是测试了答案的有效性,指出了从该方法的返回类型推断出的答案。它似乎没有解决。请检查以下代码。它甚至不编译 再次修改源代码并对其进行测试,结果导致编译时错误 问题答案: 该方法如何推断类型 没有。泛型方法不推断其泛型类型-这就是为什么称为 类型参数 的原因。方法的 调用者