2017-11-27 2 views
4

보통 인터페이스 또는 추상 클래스의 속성 게터에 @JvmName를 적용, 우리는 코 틀린에 다음 코드를 작성할 수 있습니다자바 상호 운용성이 :

val hasValue : Boolean 
    @JvmName("hasValue") get() = true 

자바 상호 운용성 방법 hasValue() 대신 getHasValue()를 생성합니다 .

그러나, 인터페이스, 이것은 나에게 컴파일 오류를 제공합니다 :

같은이 추상 클래스에 다음 선언에 간다
val hasValue : Boolean 
    @JvmName("hasValue") get 

: 그래서 여기

abstract val hasValue : Boolean 
    @JvmName("hasValue") get 

내 질문은 : 어떻게 kotlin 컴파일러에 hasValue() 대신에 getHasValue()을 사용할 수 있습니까? kotlin 인터페이스의 속성 getters (및 setters)에 대해?

답변

1

나는 Kotlin이/override 속성/기능에 @JvmName을 사용하는 데 몇 가지 제한을 가지고 있다고 생각합니다. open/override 함수에서 @JvmName의 사용을 금지하면 인터페이스/수퍼 클래스 및 하위 클래스에서 다른 jvmName을 사용하지 않아도됩니다. 다음 예에서

, 나는 인터페이스 ( hasValue)와 다른 jvmName로 오버라이드 속성 게터 ( hasValueImpl를) 주석을 시도하고 그것은 컴파일 오류가 있습니다 :

'@JvmName' annotation is not applicable to this declaration

interface Abstract { 

    @get:JvmName("hasValue")  //Compile error 
    val hasValue: Boolean 
     get() = false 
} 

open class Impl : Abstract { 

    @get:JvmName("hasValueImpl") //Compile error 
    final override val hasValue: Boolean 
     get() = false 

    @get:JvmName("hasValue2")  //Compile error if hasValue2 is open 
    val hasValue2: Boolean 
     get() = false 
} 
+0

귀하의 논증을 재정의 속성에 대해서는 의미가 있지만 아무 것도 무시하지 않는 추상/열린 속성에는 적합하지 않습니다. 주석이 달린 속성을 재정의하면 jvm 서명을 상속 받아야합니다. – msrd0

+0

맞습니다. @ JvmName은 재정의되거나 재정의 할 수있는 함수에 대해 모두 금지됩니다. https://github.com/JetBrains/kotlin/blob/19e38bbc725ec68c9d40bc5c4ad8945266df7231/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/checkers/declarationCheckers.kt#L141 @ msrd0,이 대답은 정확합니다. 받아 들여야한다. –

+0

@ Miha_x64이 답변은 정확하지만 "Kotlin 컴파일러에게 어떻게 말할 수 있습니까?"라는 질문에는 대답하지 않습니다. "Kotlin 컴파일러에게 말할 수 있습니까?"라는 질문에 대답 할 것입니다. – msrd0

관련 문제