Я думаю, что это легче всего понять, если мы посмотрим на декомпилированный байт-код Java, в который он компилируется:
Вы можете сделать это, перейдя к Tools > Kotlin > Show Kotlin Bytecode
и затем нажав Decompile
public final class Delegated implements BaseInterface {
// $FF: synthetic field
private final BaseInterface $$delegate_0;
public Delegated(@NotNull BaseInterface delegate) {
Intrinsics.checkParameterIsNotNull(delegate, "delegate");
super();
this.$$delegate_0 = delegate;
}
public void print() {
this.$$delegate_0.print();
}
}
Таким образом, когда вы выполняете делегирование интерфейса , происходит то, что Kotlin создает поле для делегата с именем $$delegate_0
и добавляет методы в ваш делегирующий класс , которыйбудет работать на $$delegate_0
.У вас также может быть несколько делегатов, они получат свои собственные поля.Однако есть одно предупреждение: вы не можете получить доступ к $$delegate_0
напрямую, даже если вы сделаете его var
следующим образом:
class Delegated(var delegate: BaseInterface) : BaseInterface by delegate
Это скомпилируется в:
public final class Delegated implements BaseInterface {
@NotNull
private BaseInterface delegate;
// $FF: synthetic field
private final BaseInterface $$delegate_0;
@NotNull
public final BaseInterface getDelegate() {
return this.delegate;
}
public final void setDelegate(@NotNull BaseInterface var1) {
Intrinsics.checkParameterIsNotNull(var1, "<set-?>");
this.delegate = var1;
}
public Delegated(@NotNull BaseInterface delegate) {
Intrinsics.checkParameterIsNotNull(delegate, "delegate");
super();
this.$$delegate_0 = delegate;
this.delegate = delegate;
}
public void print() {
this.$$delegate_0.print();
}
}
печально.Я написал об этой теме здесь .