@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을 그대로 사용할 수 있게 됩니다
관련글