英文:
Casting a java class to a generic kotlin class alters which function is called
问题
我有以下的 Kotlin 类:
abstract class Base<I> {
open fun test(value: I) {
Log.i("Base", value.toString());
}
}
abstract class SubClass : Base<Long>() {
abstract override fun test(value: Long);
}
还有一个继承它们的 Java 类:
public class SubSubClass extends SubClass {
@Override
public void test(final long value) {
Log.i("SubSubClass", value + "");
}
}
现在以下代码产生了奇怪的行为:
t.test(123)
(t as Base<Long>).test(123)
期望输出:
I/SubSubClass: 123
I/SubSubClass: 123
发生了什么?如何修复?(注意:我无法真正更改由 Room 生成的 Java 类)
英文:
I have the following kotlin classes:
abstract class Base<I> {
open fun test(value: I) {
Log.i("Base", value.toString());
}
}
abstract class SubClass : Base<Long>() {
abstract override fun test(value: Long);
}
And a java class that inherits from them:
public class SubSubClass extends SubClass {
@Override
public void test(final long value) {
Log.i("SubSubClass", value + "");
}
}
Now the following code produces weird behavior
t.test(123)
(t as Base<Long>).test(123)
>I/SubSubClass: 123
>I/Base: 123
while I would expect
>I/SubSubClass: 123
>I/SubSubClass: 123
What's going on here? And how can it be fixed? (Note: I can't really change the java class because it's generated by room)
专注分享java语言的经验与见解,让所有开发者获益!
评论