为什么Netbeans抱怨歧义,而Intellij却没有

2019年2月18日 24点热度 0条评论

我有一个带有以下Vec2i class and primary constructor的kotlin数学库:

data class Vec2i(override var x: Int, override var y: Int) : Vec2t<Int>()

然后
Vec2i在几个辅助构造函数中还具有一个应该拦截所有其他
number types的构造函数:

constructor(x: Number, y: Number) : this(x.i, y.i)

Idea之下的所有内容均会编译并运行。我用一个单独的Java项目测试了 Artifact 。

如果我切换IDE,则同一项目无法在Java项目中运行,Netbeans抱怨两者之间存在歧义。

为什么?

编辑:从进一步的分析,原来Netbeans抱怨,因为坐标之一是
int,另一个是
Integer

在Idea上尝试相同的结果是:

cannot resolve constructor

那么,为什么用
(int, int)
(Integer, Integer)调用构造函数很好,但是
(int, Integer)不能解析为辅助构造函数并引起歧义?

解决方案如下:

oracles documentation处,我们看到Integer是一个保存int的对象。
int是原始类型,而Integer是对象。

您拥有的构造函数允许传递两种类型之一,但是当您同时传递两种​​构造函数时,它们不知道该怎么做。

有关更多信息,this question具有良好的分类。