코 틀린 방법 오버로딩

세르게이 Rybalkin :

이것은 다음과 같은 선언은 코 틀린에 합법적이다.

fun foo(): String = "foo_1"
fun <T> foo(): T = "foo_2" as T

바이트 코드로서 우리는 점점 :

public final static foo()Ljava/lang/String;

// signature <T:Ljava/lang/Object;>()TT;
// declaration: T foo<T>()
public final static foo()Ljava/lang/Object;

그것은 코 틀린에서 이러한 방법 모두를 호출 할 수도 있습니다.

나는 자바에서 그 중 하나를 호출하기 위해 노력하고있어 때 문제가 온다 :

ClassKt.foo()

모호한 전화. 두 가지 방법 모두 일치 ...

어떻게 이러한 문제를 피하기 위해? 어떻게 이러한 방법으로 다루는? 어떤 3 번째 파티 KT 라이브러리 같은 문제가있는 경우?

위의 예는 합성이다.

유진 :

이 같은 두 가지 방법을 갖는 ... 자바 시작하기 위해 코 틀린 작업 않습니다 :

private static String test() {
    return "";
}

private static <T> T test() {
    return null;
}

컴파일 타임 오류가 발생합니다. 자바는이 종류의 명백한 중 하나입니다 개발진과, 이러한 방법은 동일한 유형의 삭제를 할 것입니다. 그러나 이에 의해 부과 된 규칙은 javac, 하지 바이 JVM곳이 코드가 실행됩니다. 그래서 javac것으로 두 가지 방법을 취급하지 않는 경우에만 과부하와 같은 다른 반환 유형을. 음, kotlin다른 언어이며 실행 이후 JVM(것으로 예상 유효 바이트 코드)가와 방법을 처리 할 수 있습니다 반환 형식이 과부하로 다른 존재가. 나는 바이트 코드를보고 그렇게 방법을 이해하는 것이 아직입니다; 또한이 일반적인 코드에만 작동합니다, 그래서 형의 삭제는 코 틀린의 경우 약간 차이가있을 수 있음을 보인다.

자바는 실패에서 이러한 방법을 호출하는 이유를 이제 상황이 명백해야한다. 코 틀린이의 깔끔한 솔루션을 제공합니다 @JvmName("someDistinctName"). 나는이 다리의 방법을 만들 것으로 가정하지만 나는 완전히 확인하는 방법 후드에서이 작품 중 하나 ... 아직 아닙니다.

편집하다

@JvmName 바이트 코드 레벨에있어서의 이름을 변경한다.

추천

출처http://43.154.161.224:23101/article/api/json?id=167504&siteId=1