Kotlin 재 부팅 JvmOverloads

3594 단어 -----KotlinKotlin
우선 우리 가 명확 하 게 해 야 할 것 은 Kotlin 에 과부하 가 없다 는 것 입 니 다. 그런데 왜 JvmOverloads 주석 이 있 습 니까?사실 JvmOverloads 주 해 는 자바 의 자바 를 호 환 하기 위해 서 입 니 다. 우 리 는 이렇게 다시 불 러 옵 니 다.
	void add(int a){}
    void add(int a,int b){}
    void add(int a,int b,int c){}
    void add(int a,int b,int c,int d){}
    void add(int a,int b,int c,int d,int e){}

우 리 는 실제 적 으로 없 는 매개 변수 에 기본 적 인 매개 변 수 를 주 고 최종 적 으로 매개 변수 가 가장 많은 방법 으로 호출 하 는 것 입 니 다. Kotin 에서 이런 방법 을 어떻게 쓰 는 지 하 는 방법 은 충분 합 니 다.
fun add(a: Int,b:Int=0,c:Int=0,d:Int=0,e:Int=0) {}

Kotlin 에 서 는 인자 에 기본 값 을 줄 수 있 기 때문에 Kotlin 은 다시 불 러 올 필요 가 없습니다.어떤 사람 은 나의 리 셋 이 서로 다른 논리 적 인 것 을 호출 했다 고 말 했 습 니 다. 그러면 방법 명 을 다시 명명 해 주 십시오.사용자 정의 View 를 사용 할 때 4 개의 구조 함 수 를 다시 불 러 옵 니 다. 자바 는 이렇게 이 루어 집 니 다.
public class TestView extends View {
    public TestView(Context context) {
        this(context,null);
    }

    public TestView(Context context, @Nullable AttributeSet attrs) {
        this(context, attrs,0);
    }

    public TestView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        this(context, attrs, defStyleAttr,0);
    }

    public TestView(Context context, @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes) {
        super(context, attrs, defStyleAttr, defStyleRes);
    }
}

Kotlin 에서 매우 간단 합 니 다:
class PieChart @JvmOverloads constructor(context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0, defStyleRes: Int = 0) : View(context, attrs, defStyleAttr, defStyleRes) {
}

자바 와 호 환 되 지 않 으 면 @ JvmOverloads 는 생략 할 수 있 습 니 다.
@ JvmOverloads 의 설명 을 살 펴 보 겠 습 니 다.
/**
 * Instructs the Kotlin compiler to generate overloads for this function that substitute default parameter values.
 *
 * If a method has N parameters and M of which have default values, M overloads are generated: the first one
 * takes N-1 parameters (all but the last one that takes a default value), the second takes N-2 parameters, and so on.
 */
@Target(AnnotationTarget.FUNCTION, AnnotationTarget.CONSTRUCTOR)
@Retention(AnnotationRetention.BINARY)
@MustBeDocumented
public annotation class JvmOverloads

JvmOverloads 의 역할 은 기본 값 이 있 는 매개 변 수 를 다시 불 러 오 는 것 입 니 다. JvmOverloads 가 있 는 지 없 는 지 확인 해 보 겠 습 니 다.
class Overloads {
    fun add(a: Int,b:Int=0) {}
}

Java 생 성:
public final class Overloads {
   public final void add(int a, int b) {
   }

   // $FF: synthetic method
   // $FF: bridge method
   public static void add$default(Overloads var0, int var1, int var2, int var3, Object var4) {
      if ((var3 & 2) != 0) {
         var2 = 0;
      }

      var0.add(var1, var2);
   }
}

자바 에서 호출 할 수 있 는 두 개의 인자 만 있 는 방법 을 발 견 했 습 니 다.
void test(){
        new Overloads().add(0); //     
    }

Kotlin 에 서 는 가능 합 니 다.
다음은 JvmOverloads 가 있 습 니 다.
public final class Overloads {
   @JvmOverloads
   public final void add(int a, int b) {
   }

   // $FF: synthetic method
   // $FF: bridge method
   @JvmOverloads
   public static void add$default(Overloads var0, int var1, int var2, int var3, Object var4) {
      if ((var3 & 2) != 0) {
         var2 = 0;
      }

      var0.add(var1, var2);
   }

   @JvmOverloads
   public final void add(int a) {
      add$default(this, a, 0, 2, (Object)null);
   }
}

@ JvmOverloads 를 자바 로 바 꾸 면 해당 하 는 리 셋 방법 이 생 성 되 는 것 을 발 견 했 습 니 다.
요약: 1. @ JvmOverloads 는 자바 호출 Kotlin 을 호 환 하 는 기본 매개 변수 방법 이 있 습 니 다.

좋은 웹페이지 즐겨찾기