If a single implementation, as in @zsmb13's answer, is not enough for you and you need separate implementations for the two methods in Kotlin, then you can add an intermediate interface overriding the method accepting Integer
with a nullable parameter:
private interface IntermediateA : A {
override fun get(i: Int?): Any
}
Implementing this interface instead of the original A
, the Kotlin compiler will distinguish the two methods, allowing you to override them as follows:
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
If you had access to the Java code, you could fix this by adding a nullability annotation to the method accepting the boxed type:
Object get(@Nullable Integer i);
The Kotlin compiler understands different kinds of nullability annotations, here's the list.
fun get(i: Integer /* or Integer? */) = ...; fun get(i: Int) = ...
? – Logographic