Java 函数参数标记为“非空”时的“重载解析模糊”
以下是我的Kotlin版本1.3.61+Java1.8.0_201未能编译的代码: 马文:Java 函数参数标记为“非空”时的“重载解析模糊”,java,kotlin,annotations,Java,Kotlin,Annotations,以下是我的Kotlin版本1.3.61+Java1.8.0_201未能编译的代码: 马文: <dependency> <groupId>com.google.code.findbugs</groupId> <artifactId>jsr305</artifactId> <version>2.0.1</version> </dependency> 由于以下错误,未能编译: Er
<dependency>
<groupId>com.google.code.findbugs</groupId>
<artifactId>jsr305</artifactId>
<version>2.0.1</version>
</dependency>
由于以下错误,未能编译:
Error:(2, 13) Kotlin: Overload resolution ambiguity:
public open fun setX(@Nonnull x: Int): Unit defined in Point
public open fun setX(x: Int): Unit defined in Point
如果我在第二个setX函数中删除了@NonNull注释,那么这个演示就可以编译了。我认为Java注释只是额外的元数据,不会影响代码本身,所以我不知道为什么这里会出现歧义
另外,我运行了javap-s Point.class,发现它们有相同的输出:
public void setX(java.lang.Integer);
descriptor: (Ljava/lang/Integer;)V
有人能解释一下这里发生了什么事吗?提前谢谢 来自kotlin的行动
有时Java代码包含关于可空性的信息,表示为
使用注释。当此信息出现在代码中时,
科特林使用它。因此,Java中的@Nullable String被视为String?通过
Kotlin和@NotNull字符串只是字符串。有趣的
问题是当注释不存在时会发生什么。在这种情况下
Java类型成为Kotlin中的平台类型
当您使用来自Kotlin的Java声明时,Java基本类型
变为非空类型而不是平台类型,因为它们无法容纳
空值
在您的例子中,第一个方法有一个java primitve类型作为参数,因为primitives不能为null,所以kotlin将其转换为
setX(x: Int)
由于第二个方法包含@Nonnull注释,kotlin使用了这个信息,因此它将该方法转换为
setX(x: Int)
因此,正如您所看到的,对于kotlin来说,它们是两种具有完全相同特征的不同方法,因此存在歧义。或许可以退一步,解释一下为什么您首先会使用这两种方法。我不认为拥有这两个功能会对callerA产生什么影响,因为在我的项目中,类似的代码是从Avro生成的。虽然他们不应该被直接呼叫,但他们是公开的。所以我有这个问题@利诺赛斯莫尼卡酒店
setX(x: Int)
setX(x: Int)