既然Kotlin没有原语,这个接口怎么实现呢?
public interface A {
@NotNull Object get(@NotNull Integer i);
@NotNull Object get(int i);
}
我无法更改 Java 代码,因为它是二进制库中的已编译类文件。
原文由 ice1000 发布,翻译遵循 CC BY-SA 4.0 许可协议
既然Kotlin没有原语,这个接口怎么实现呢?
public interface A {
@NotNull Object get(@NotNull Integer i);
@NotNull Object get(int i);
}
我无法更改 Java 代码,因为它是二进制库中的已编译类文件。
原文由 ice1000 发布,翻译遵循 CC BY-SA 4.0 许可协议
仅实现一种方法,该方法采用 Int
作为其参数,并且可以从 Kotlin 或 Java 调用。
class B : A {
override fun get(i: Int): Any {
return "something"
}
}
如果你反编译字节码,你会发现 Kotlin 编译器足够聪明,可以创建这两种方法,其中一种只是重定向到真正的实现。
一个可能的问题是您不能使该方法采用 Int?
,并且它会崩溃并在 NullPointerException
上调用 .intValue()
如果它像 Java 一样调用所以:
B b = new B();
Integer i = null;
b.get(i);
我不确定是否有办法解决该用例。
编辑: 热键的答案中包含其余答案。
原文由 zsmb13 发布,翻译遵循 CC BY-SA 3.0 许可协议
15 回答8.4k 阅读
8 回答6.2k 阅读
1 回答4k 阅读✓ 已解决
3 回答6k 阅读
3 回答2.2k 阅读✓ 已解决
2 回答3.1k 阅读
2 回答3.8k 阅读
如果 @zsmb13 的回答中的单个实现对您来说不够,并且您需要为 Kotlin 中的两种方法单独实现,那么您可以添加一个中间接口来覆盖接受
Integer
的方法可空参数:实现此接口而不是原来的
A
,Kotlin 编译器将区分这两个方法,允许您按如下方式覆盖它们:如果您有权访问 Java 代码,则可以通过向接受装箱类型的方法添加可空性注释来解决此问题:
Kotlin 编译器理解不同类型的可空性注释, 列表如下。