如何在 Kotlin 中实现这个 Java 接口?
2022-09-01 07:44:26
既然 Kotlin 没有基元,那么这个接口该如何实现呢?
public interface A {
@NotNull Object get(@NotNull Integer i);
@NotNull Object get(int i);
}
我无法更改Java代码,因为它是二进制库中的已编译类文件。
既然 Kotlin 没有基元,那么这个接口该如何实现呢?
public interface A {
@NotNull Object get(@NotNull Integer i);
@NotNull Object get(int i);
}
我无法更改Java代码,因为它是二进制库中的已编译类文件。
如果单个实现(如@zsmb13的答案)对您来说还不够,并且您需要为Kotlin中的两个方法单独实现,那么您可以添加一个中间接口来覆盖使用可为 null 的参数接受的方法:Integer
private interface IntermediateA : A {
override fun get(i: Int?): Any
}
实现此接口而不是原始接口,Kotlin 编译器将区分这两种方法,允许您按如下方式重写它们:A
class C : IntermediateA {
override fun get(i: Int) = "primitive"
override fun get(i: Int?) = "boxed"
}
val a: A = C()
println(a.get(1)) // primitive
println(a.get(1 as Int?)) // boxed
如果您有权访问 Java 代码,则可以通过在接受框内类型的方法中添加可空性注释来解决此问题:
Object get(@Nullable Integer i);
Kotlin 编译器理解不同类型的可空性注释,下面是列表。
只实现一个作为其参数的方法工作,并且可以从Kotlin或Java调用。Int
class B : A {
override fun get(i: Int): Any {
return "something"
}
}
如果你反编译字节码,你会看到Kotlin编译器足够聪明,可以创建这两种方法,其中一个只是重定向到真正的实现。
一个可能的问题是,你不能让方法采取,如果它从Java调用,它会崩溃与一个 on 调用,如下所示:Int?
NullPointerException
.intValue()
B b = new B();
Integer i = null;
b.get(i);
我不确定是否有办法解决该用例。
编辑:热键的答案中有其余的答案。