자바 vs. 코틀린 코틀린과 달리 자바에서는 포획한 변수의 값을 변경할 수 없다. 더 나아가 익명 클래스 내부에서 포획한 변수를 사용할 경우에는 명시적으로 final로 선언해야만 한다. 하지만 코틀린이 제공하는 포획 변수를 변경하는 기능은 그에 따른 비용을 수반한다. 익명 객체와 이 객체를 둘러싸고 있는 코드 사이에 변수를 공유하기 위해 코틀린 컴파일러는 (공유되는) 값을 특별한 래퍼(wrapper) 객체로 둘러싼다. 위 Counter 예제를 컴파일한 바이트코드에 해당하는 자바 코드는 다음과 같다.
import kotlin.jvm.internal.Ref.IntRef; class MainKt { public static void main(String[] args) { final IntRef x = new IntRef(); // 래퍼 생성 x.element = 1; final class Counter { public final void increment() { x.element++; // 공유된 데이터 변경하기 } } (new Counter()).increment(); System.out.println(x.element); // 공유된 데이터 읽기 } }