본문 바로가기

[Kotlin] @JvmSuppressWildCards 의미

@JvmSuppressWildcards 애노테이션

@JvmSuppressWildcards

코틀린 컴파일러는 제네릭을 기본적으로  List<String>List<? extends String> 형태로 변환합니다

이런형태의 자동변환을 방지하는 방법은 @JvmSuppressWildcards 입니다

이해를 돕기 위한 예시는 아래와 같습니다

WildcardTest.kt
abstract class WildcardTest<T> {

    // @JvmSuprressWildcards 주석을 사용하지 않은 order1 메서드
    abstract fun order1(orderList: List<T>)
    
    // @JvmSuprressWildcards 주석을 사용한 order2 메서드
    abstract fun order2(orderList: List<@JvmSuprressWildcards T>)
}

@JvmSuprressWildcards 주석을 사용하지 않은 order1, 사용한 order2 추상메서드 2개를 선언했습니다

위 Kotlin 추상 클래스를 자바에서 상속하게 되면 아래처럼 구현이 됩니다

WildcardTestImpl.class
public class WildcardTestImpl extends WildcardTest<Coffee> {

    // 사용하지 않은 order1 메서드
    @Override
    public void order1(@NotNull List<? extends Coffee> orderList) {	// WildCard가 자동 설정됨
    }
    
    // @JvmSuppressWildcards 사용한 order2 메소드
    @Override
    public void order2(@NotNull List<Coffee> orderList) {
    }
}

WildcardTest 추상클래스의 추상메서드 order1과 order2 구현모습입니다

@JvmSuprressWildcards를 사용하지 않은 order1메서드는 매개변수로 Wildcard를 받게 구현되어서, 사용하려면 따로 형 지정이 필요합니다

@JvmSupreessWildcards를 사용한 order2메서드는 매개변수를 그대로 받을 수 있게 구현되어서, 매개변수 Type을 그대로 사용할 수 있게 됩니다

 

 

관련글