dead.fish
06/04/2021, 2:17 PMAbstractMethodError
when I try to call a fun interface
method with Kotlin 1.5:
// definition
fun interface OnItemClickListener {
fun onChannelClicked(channelId: ChannelId)
}
internal var clickListener: OnItemClickListener? = null
// callsite
holder.itemView.setOnClickListener {
clickListener?.onChannelClicked(channelId)
// ^^^ line 63, crash here
}
// Runtime crash
java.lang.AbstractMethodError: abstract method "void path.to.ChannelItemViewAdapter$OnItemClickListener.onChannelClicked-Grz9ttw(java.lang.String)"
at path.to.ChannelItemViewAdapter.onBindViewHolder$lambda-3$lambda-2(ChannelItemViewAdapter.kt:63)
at path.to.ChannelItemViewAdapter.lambda$CKDKaveMGRwL-cim-kOMtD1bOuU(Unknown Source:0)
// decompiled Kotlin
public interface OnItemClickListener {
void onChannelClicked_Grz9ttw/* $FF was: onChannelClicked-Grz9ttw*/(@NotNull String var1);
}
public final void onClick(View it) {
ChannelItemViewAdapter.OnItemClickListener var10000 = this.this$0.getClickListener$communication_debug();
if (var10000 != null) {
var10000.onChannelClicked-Grz9ttw(this.$this_with.getChannelId-WlYWy3A());
}
}
Any idea what the culprit might be here?ephemient
06/04/2021, 2:20 PMdead.fish
06/04/2021, 2:20 PMChannelId
is a value class
, might this be the culprit?dead.fish
06/04/2021, 2:20 PMdead.fish
06/04/2021, 2:21 PMfun interfaces
in the bugtracker, but none really fits my issue: https://youtrack.jetbrains.com/issue/KT-37866ephemient
06/04/2021, 2:22 PMephemient
06/04/2021, 2:23 PMdead.fish
06/04/2021, 2:32 PMdead.fish
06/04/2021, 2:33 PMdead.fish
06/04/2021, 2:39 PM-Xuse-14-inline-classes-mangling-scheme
in freeCompilerArgs
I run into the same error.dead.fish
06/04/2021, 2:39 PMdead.fish
06/04/2021, 2:51 PM@JvmInline
value class Foo(private val inner: String)
fun interface Callback {
fun doSomething(foo: Foo)
}
fun main() {
val bla = Callback {
println(it)
}
bla.doSomething(Foo("Hello world!"))
}
dead.fish
06/04/2021, 2:51 PMdead.fish
06/07/2021, 10:27 AMwith(binding.messageList) {
val channelAdapter = ChannelItemViewAdapter()
adapter = channelAdapter
...
channelAdapter.clickListener = ChannelItemViewAdapter.OnItemClickListener { channelId ->
viewModel.onChannelClicked(channelId)
}
}
and when I called .javaClass.methods
on the channelAdapter.clickListener
afterwards, I saw indeed an abstract method:
result = {Method[11]@37369}
0 = {Method@37370} "public boolean java.lang.Object.equals(java.lang.Object)"
...
5 = {Method@37375} "public abstract void path.to.ChannelItemViewAdapter$OnItemClickListener.onChannelClicked-Grz9ttw(java.lang.String)"
6 = {Method@37376} "public final void path.to.MyFragment$onCreateView$1$2.onChannelClicked-Grz9ttw-Grz9ttw(java.lang.String)"
...
where method 37376
was obviously the right, but wrongly named one. When I moved code a little back and forth, this abstract method vanished and I couldn’t reproduce the issue any longer 😞dead.fish
06/07/2021, 10:39 AMchannelAdapter.clickListener = ChannelItemViewAdapter.OnItemClickListener {
viewModel.onChannelClicked(it)
}
is used instead of
channelAdapter.clickListener = ChannelItemViewAdapter.OnItemClickListener { channelId ->
viewModel.onChannelClicked(channelId)
}
dead.fish
06/07/2021, 10:46 AMdead.fish
06/08/2021, 7:49 AM