Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 函数参数标记为“非空”时的“重载解析模糊”_Java_Kotlin_Annotations - Fatal编程技术网

Java 函数参数标记为“非空”时的“重载解析模糊”

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

以下是我的Kotlin版本1.3.61+Java1.8.0_201未能编译的代码:

马文:

<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)