Björn Mayer
12/19/2023, 4:22 PMfun main() {
val a = Baz()
a.remove("test")
}
class Baz : Bar() {
override fun remove(key: String): Boolean {
println("Some logic here")
return super.remove(key)
}
}
abstract class Bar : Foo<String>()
abstract class Foo<K> : MutableList<K> {
override fun remove(key: K) : Boolean {
println("This is never executed")
return true
}
// other MutableList Impls with TODO()
}
Daniel Pitts
12/19/2023, 4:55 PMDaniel Pitts
12/19/2023, 4:55 PMfun main() {
Impl().remove("test")
}
class Impl : Parent() {
override fun remove(key: String): Boolean {
println("Some logic here")
return super.remove(key)
}
}
abstract class Parent : Grandparent<String>() {
// override fun remove(key: String): Boolean {
// return super.remove(key)
// }
}
abstract class Grandparent<K> : MutableList<K> by mutableListOf() {
override fun remove(key: K): Boolean {
println("This is never executed")
return true
}
}
Daniel Pitts
12/19/2023, 4:56 PMDaniel Pitts
12/19/2023, 4:56 PMDaniel Pitts
12/19/2023, 4:56 PMDaniel Pitts
12/19/2023, 4:58 PMSam
12/19/2023, 4:58 PMDaniel Pitts
12/19/2023, 4:59 PMDaniel Pitts
12/19/2023, 5:01 PMSam
12/19/2023, 5:02 PMpublic final bridge remove(Ljava/lang/Object;)Z
L0
LINENUMBER 13 L0
ALOAD 1
INSTANCEOF java/lang/String
IFNE L1
ICONST_0
IRETURN
L1
FRAME SAME
ALOAD 0
ALOAD 1
CHECKCAST java/lang/String
INVOKEVIRTUAL Bar.remove (Ljava/lang/String;)Z
IRETURN
MAXSTACK = 2
MAXLOCALS = 2
Bar.remove(Object)
is calling Bar.remove(String)
, which is the one that's actually overridden 😬. It should probably just be calling Foo.remove(Object)
instead.Sam
12/19/2023, 5:03 PMMutableList
😄Björn Mayer
12/19/2023, 5:54 PMDaniel Pitts
12/19/2023, 6:30 PMBjörn Mayer
12/20/2023, 9:41 AM