TGViewer
Everlasting Loops Everlasting Loops @loops_everlasting · 565 subscribers
Post #6 980
Kotlin function types

ответил в комментариях в Android Good Reads, но решил и тут написать, вдруг кому-то будет интересно

допустим, у нас есть такой Java-класс


public class SomeJavaClass {

interface Listener {
void onEvent(String event);
}

private HashSet<Listener> listeners = new HashSet<>();

void addListener(Listener listener) {
listeners.add(listener);
}

void removeListener(Listener listener) {
listeners.remove(listener);
}
}


и такой Kotlin-класс


class SomeKotlinClass {

private val eventListenerLambda = { eventId: String ->
println(eventId)
}

fun testLambdas(someJavaClass: SomeJavaClass) {
someJavaClass.addListener(eventListenerLambda)

someJavaClass.removeListener(eventListenerLambda)
}
}


чтобы передать лямбду типа (String) -> Unit в качестве параметра типа Listener, компилятор либо использует method reference, либо, когда Java 6, заворачивает в адаптер, и в обоих случаях инстанс итогового Listener каждый раз получается разный


public final class SomeKotlinClass {
@NotNull
private final Function1 eventListenerLambda = SomeKotlinClass::eventListenerLambda$lambda$0;
public static final int $stable;

public final void testLambdas(@NotNull SomeJavaClass someJavaClass) {
Intrinsics.checkNotNullParameter(someJavaClass, "someJavaClass");
Function1 var2 = this.eventListenerLambda;
someJavaClass.addListener(SomeKotlinClass::testLambdas$lambda$1);
var2 = this.eventListenerLambda;
someJavaClass.removeListener(SomeKotlinClass::testLambdas$lambda$2);
}

private static final Unit eventListenerLambda$lambda$0(String eventId) {
Intrinsics.checkNotNullParameter(eventId, "eventId");
System.out.println(eventId);
return Unit.INSTANCE;
}

private static final void testLambdas$lambda$1(Function1 $tmp0, String event) {
$tmp0.invoke(event);
}

private static final void testLambdas$lambda$2(Function1 $tmp0, String event) {
$tmp0.invoke(event);
}
}


и если запустить, можно увидеть, что после выполнения someJavaClass.removeListener(eventListenerLambda) содержимое listeners не изменится

напишите в комменты, кому это было очевидно!
  • 🔥 3
  • ❤ 1
More from @loops_everlasting
  1. Jul 23, 2025невероятный успех #pull_request
  2. Jul 23, 2025Так выглядел вайбкодинг с Kiro (мем мой)
  3. Jul 23, 2025Post #25
  4. Jul 23, 2025Кстати, если вдруг хотите еще на кого-нибудь подписаться, есть целая папка с годными канал…
  5. Jul 23, 2025Пока готовил пост, заметил, что забыл в автокомплите точку с запятой
  6. Jul 23, 2025Еще к первому посту про плагин в комментарии прилетел фича-реквест от Асхара из канала Пол…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →