我尝试从 Kotlin 调用自定义 Java 集合,它以这种方式实现了一个
add(long value)
方法:
public class SomeSet<T> {
public void add(int value) { }
public void add(long value) { }
public void add(T value) { }
}
在Java中我们可以毫无问题地调用重载方法:
SomeSet<Long> set = new SomeSet<Long>();
set.add(1);
set.add(1L);
但在 Kotlin 中这似乎是不可能的:
val set = SomeSet<Long>()
set.add(1 as Int)
set.add(1L) // ⚡ Overload resolution ambiguity
set.add(1L as Long) // ⚡ Overload resolution ambiguity
完全编译错误:
Overload resolution ambiguity. All these functions match.
public open fun add(value: Long): Unit defined in de.itscope.platform.producttracking.test.SomeSet
public open fun add(value: Long!): Unit defined in de.itscope.platform.producttracking.test.SomeSe
我已经检查了建议,对于一个很可能的问题:
Kotlin:当 Java 库重载原始类型和盒装类型时,我该怎么办?
但这在这里没有帮助,因为这个通用重载。
ℹ 这不是学术例子。这是方式
班级实施。来自 ZetaSketch 库的 HyperLogLog++ 实现。com.google.zetasketch.HyperLogLogPlusPlus
我发现调用
add
函数的唯一技巧是将 Any
设置为通用类型:
val set: SomeSet<*> = SomeSet<Any>()
set.add(1)
set.add(1L)