如何解决从 Kotlin 调用泛型重载 Java 类的重载解析歧义

问题描述 投票:0回答:1

我尝试从 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 库重载原始类型和盒装类型时,我该怎么办?
但这在这里没有帮助,因为这个通用重载。

ℹ 这不是学术例子。这是方式

com.google.zetasketch.HyperLogLogPlusPlus
班级实施。来自 ZetaSketch 库的 HyperLogLog++ 实现。

java kotlin generics ambiguity
1个回答
0
投票

我发现调用

add
函数的唯一技巧是将
Any
设置为通用类型:

val set: SomeSet<*> = SomeSet<Any>()
set.add(1)
set.add(1L)
© www.soinside.com 2019 - 2024. All rights reserved.