Kotlin:当Java库同时重载基本类型和包装类型时,我该怎么办?

9
例如,FastUtil的IntArrayList拥有一个push方法,可以接受int(基本类型)和Integer(装箱类型),但是Kotlin将它们都视为相同的函数push(Int),因此我无法使用该函数,因为该函数是模棱两可的。当Java库同时支持基本数据类型和包装类型时,我该怎么办呢?
(注:我知道我可以使用add(int)方法。我正在寻找未来遇到此类问题时应该怎么做。)
2个回答

10

考虑Java中的这些方法:

void f(int x) { }
void f(Integer y) { }
在 Kotlin 中,它们被视为
f(x: Int)
f(x: Int!)

第二种方法有一个参数为平台类型,这意味着它可能是可空的,对应于Integer

第一种方法可以简单地使用 Kotlin 的 Int 传递调用:

f(5) // calls f(int x)
为了调用第二个函数,你可以将参数强制转换为可空类型Int?,这样就可以选择重载函数:
f(5 as Int?) // calls f(Integer y)

1
这似乎无法在Kotlin 1.0.2稳定版中运行(x是一个Int):http://i.imgur.com/KLVy5Vn.png - Jire
1
@Jire,啊,的确如此。我只是在同一项目中测试了Java源代码,并且对于那种情况它可以工作。问题是对于push(Integer),由于某些原因Kotlin签名是push(Int)而不是push(Int!) - hotkey
1
@Jire,结果证明这是编译器中的一个漏洞。 - hotkey
2
这个解决方案在 v1.0.3 版本中不起作用,但显然在 v1.1-M01 版本上可以工作。 - Enno Shioji
1
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - hotkey
显示剩余2条评论

1

您尝试过编写一个Java类作为中介吗?也就是说,编写自己的Java类,其中包含您想让Kotlin看到的方法,然后从Kotlin代码中调用该方法。


2
这是一个可行的解决方案,但你不觉得可能有更简单的方法吗? - Jire

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接