이 인터페이스가 있다고 가정 해 봅시다 :
interface Things {
fun size(): Int
}
그리고
List
를 서브 클래스로 만들고 싶습니다
이 인터페이스를 구현하십시오.
class Cars : ArrayList<String>, Things {}
컴파일 오류가 발생했습니다 :
Inherited platform declarations clash: The following declarations have the same JVM signature (size()I): fun (): Int defined in Things fun size(): Int defined in Things
size
를 변경하여 컴파일 오류를 해결할 수 있습니다.
var
와 계약
암시 적 getter :
interface Things {
var size: Int
}
그러나 런타임 오류처럼 보이는 길고 복잡한 오류가 발생합니다 (
IllegalStateException
) 그러나 Kotlin이 컴파일 할 때 발생하는 것 같습니다 : shrug :
이러한 이유가 무엇인지 알고 있습니다.-
ArrayList
이미
int size()
가 있습니다
Kotlin은 이제 동일한 서명을 추가하려고 시도하지만 내가 옳더라도 (10 % 확률?) 별 도움이되지 않습니다.
또한
get
를 가질 수 있다고 언급하겠습니다.
Things
의 일부로
인터페이스는 목록에 의해 만족됩니다. 나는
operator
를 추측 해요
연산자 슬라이드하기에 충분할 정도로 다르게 설정 했습니까?
어쨌든 IDE 오류는 없지만 빌드 할 때 다음을 얻습니다.
java.lang.IllegalStateException: Backend Internal error: Exception during code generation
Cause: Concrete fake override public open fun <set-size>(<set-?>: kotlin.Int): kotlin.Unit defined in org.blah.Stuff[PropertySetterDescriptorImpl@673f2280] should have exactly one concrete super-declaration: []
File being compiled at position: file:///blah/Stuff.kt
The root cause was thrown at: bridges.kt:122
at org.jetbrains.kotlin.codegen.CompilationErrorHandler.lambda$static$0(CompilationErrorHandler.java:24)
at org.jetbrains.kotlin.codegen.PackageCodegenImpl.generate(PackageCodegenImpl.java:76)
at org.jetbrains.kotlin.codegen.DefaultCodegenFactory.generatePackage(CodegenFactory.kt:96)
at org.jetbrains.kotlin.codegen.DefaultCodegenFactory.generateModule(CodegenFactory.kt:67)
at org.jetbrains.kotlin.codegen.KotlinCodegenFacade.doGenerateFiles(KotlinCodegenFacade.java:47)
at org.jetbrains.kotlin.codegen.KotlinCodegenFacade.compileCorrectFiles(KotlinCodegenFacade.java:39)
at org.jetbrains.kotlin.cli.jvm.compiler.KotlinToJVMBytecodeCompiler.generate(KotlinToJVMBytecodeCompiler.kt:476)
at org.jetbrains.kotlin.cli.jvm.compiler.KotlinToJVMBytecodeCompiler.compileModules$cli(KotlinToJVMBytecodeCompiler.kt:164)
at org.jetbrains.kotlin.cli.jvm.K2JVMCompiler.doExecute(K2JVMCompiler.kt:166)
at org.jetbrains.kotlin.cli.jvm.K2JVMCompiler.doExecute(K2JVMCompiler.kt:56)
at org.jetbrains.kotlin.cli.common.CLICompiler.execImpl(CLICompiler.kt:84)
at org.jetbrains.kotlin.cli.common.CLICompiler.execImpl(CLICompiler.kt:42)
at org.jetbrains.kotlin.cli.common.CLITool.exec(CLITool.kt:104)
at org.jetbrains.kotlin.incremental.IncrementalJvmCompilerRunner.runCompiler(IncrementalJvmCompilerRunner.kt:349)
at org.jetbrains.kotlin.incremental.IncrementalJvmCompilerRunner.runCompiler(IncrementalJvmCompilerRunner.kt:105)
at org.jetbrains.kotlin.incremental.IncrementalCompilerRunner.compileIncrementally(IncrementalCompilerRunner.kt:237)
at org.jetbrains.kotlin.incremental.IncrementalCompilerRunner.access$compileIncrementally(IncrementalCompilerRunner.kt:37)
at org.jetbrains.kotlin.incremental.IncrementalCompilerRunner$compile$2.invoke(IncrementalCompilerRunner.kt:79)
at org.jetbrains.kotlin.incremental.IncrementalCompilerRunner.compile(IncrementalCompilerRunner.kt:91)
at org.jetbrains.kotlin.daemon.CompileServiceImpl.execIncrementalCompiler(CompileServiceImpl.kt:579)
at org.jetbrains.kotlin.daemon.CompileServiceImpl.access$execIncrementalCompiler(CompileServiceImpl.kt:102)
at org.jetbrains.kotlin.daemon.CompileServiceImpl$compile$$inlined$ifAlive$lambda$2.invoke(CompileServiceImpl.kt:455)
at org.jetbrains.kotlin.daemon.CompileServiceImpl$compile$$inlined$ifAlive$lambda$2.invoke(CompileServiceImpl.kt:102)
at org.jetbrains.kotlin.daemon.CompileServiceImpl$doCompile$$inlined$ifAlive$lambda$2.invoke(CompileServiceImpl.kt:1005)
at org.jetbrains.kotlin.daemon.CompileServiceImpl$doCompile$$inlined$ifAlive$lambda$2.invoke(CompileServiceImpl.kt:102)
at org.jetbrains.kotlin.daemon.common.DummyProfiler.withMeasure(PerfUtils.kt:138)
at org.jetbrains.kotlin.daemon.CompileServiceImpl.checkedCompile(CompileServiceImpl.kt:1047)
at org.jetbrains.kotlin.daemon.CompileServiceImpl.doCompile(CompileServiceImpl.kt:1004)
at org.jetbrains.kotlin.daemon.CompileServiceImpl.compile(CompileServiceImpl.kt:454)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:346)
at sun.rmi.transport.Transport$1.run(Transport.java:200)
at sun.rmi.transport.Transport$1.run(Transport.java:197)
at java.security.AccessController.doPrivileged(Native Method)
at sun.rmi.transport.Transport.serviceCall(Transport.java:196)
at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:568)
at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:826)
at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.lambda$run$0(TCPTransport.java:683)
at java.security.AccessController.doPrivileged(Native Method)
at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:682)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.IllegalStateException: Concrete fake override public open fun <set-size>(<set-?>: kotlin.Int): kotlin.Unit defined in org.blah.Stuff[PropertySetterDescriptorImpl@673f2280] should have exactly one concrete super-declaration: []
at org.jetbrains.kotlin.backend.common.bridges.BridgesKt.findConcreteSuperDeclaration(bridges.kt:122)
at org.jetbrains.kotlin.backend.common.bridges.BridgesKt.generateBridges(bridges.kt:59)
at org.jetbrains.kotlin.codegen.JvmBridgesImplKt.generateBridgesForFunctionDescriptorForJvm(JvmBridgesImpl.kt:92)
at org.jetbrains.kotlin.codegen.FunctionCodegen.generateBridges(FunctionCodegen.java:1041)
at org.jetbrains.kotlin.codegen.ClassBodyCodegen.generateBridges(ClassBodyCodegen.java:138)
at org.jetbrains.kotlin.codegen.ClassBodyCodegen.generateBody(ClassBodyCodegen.java:116)
at org.jetbrains.kotlin.codegen.MemberCodegen.generate(MemberCodegen.java:129)
at org.jetbrains.kotlin.codegen.MemberCodegen.genClassOrObject(MemberCodegen.java:302)
at org.jetbrains.kotlin.codegen.MemberCodegen.genClassOrObject(MemberCodegen.java:286)
at org.jetbrains.kotlin.codegen.PackageCodegenImpl.generateClassesAndObjectsInFile(PackageCodegenImpl.java:118)
at org.jetbrains.kotlin.codegen.PackageCodegenImpl.generateFile(PackageCodegenImpl.java:137)
at org.jetbrains.kotlin.codegen.PackageCodegenImpl.generate(PackageCodegenImpl.java:68)
... 44 more
> Task :app:buildInfoGeneratorDebug
아무것도 없습니다. 나는 대부분의 인생을 자바에서 보냈고 코 틀린 파티에 늦었다. 모든 대안, 대안 ... 또는 이것이 알려진 것입니까?
TYIA
- 답변 # 1
관련 자료
- android - 클래스의 Kotlin 내부 인터페이스 선언
- Python에서 ThreadResetAbort 메소드를 구현하는 방법
- java - [orgspringframeworkbeansfactoryxmlNamespaceHandler] 인터페이스를 구현하지 않습니다
- java - 매개 변수는 동일하지만 서명이 다른 메소드를 구현하는 방법
- spring boot - cglib 프록시의 차이점 구현 인터페이스는 무엇입니까?
- c# - 인터페이스를 구현하는 모든 객체가 특정 필드를 갖도록 요구하는 방법
- java - 이 경우 람다를 사용할 수 있습니까 (One method interface)?
- ios - 예 아니오 상자를 ViewController 메소드로 구현하는 방법은 무엇입니까?
- kotlin의 앱 구매에서 Android를 구현하는 방법은 무엇입니까?
- 제네릭과 Dagger가있는 Kotlin 인터페이스
- java - Kotlin에서 스프링 분석법 주입이 작동하지 않는 이유는 무엇입니까?
- java - 인터페이스에서 메소드가 DAO 패턴을 사용하여 일반 List 를 리턴하도록하는 방법이 있습니까?
- android - libgdx Admob 구현에서 널 오브젝트 참조에서 인터페이스 메소드 호출을 시도하십시오
- android - kotlin에서 탐색 창을 구현하려고하는데 오류가 발생합니다
- kotlin은 리플렉션을 통해 위임 된 메서드에 액세스 할 수 없습니다 - "javalangnosuchmethodexception"
- c# - 클래스를 인터페이스로 등록하고 메소드를 호출하는 방법은 무엇입니까?
- typescript - 나머지 매개 변수로 인터페이스를 구현하는 방법은 무엇입니까?
- android - onActivityResult Override 메소드에 대한 인터페이스를 처리하는 방법
- java - 인터페이스 EventExecutor의 inEventLoop 메소드를 이해하는 방법은 무엇입니까?
- scala - 이미 기본값을 사용하는이 방법에서 _은 무엇을 의미합니까?
- OpenCv의 폴더에서 여러 이미지 읽기 (python)
- 파이썬 셀레늄 모든 "href"속성 가져 오기
- html - 자바 스크립트 - 클릭 후 변경 버튼 텍스트 변경
- git commit - 자식 - 로컬 커밋 된 파일에 대한 변경을 취소하는 방법
- JSP에 대한 클래스를 컴파일 할 수 없습니다
- javascript - 현재 URL에서 특정 div 만 새로 고침/새로 고침
- jquery - JavaScript로 현재 세션 값을 얻으시겠습니까?
- javascript - swiperjs에서 정지, 재생 버튼 추가
- JavaScript 변수를 HTML div에 '출력'하는 방법
- python - 문자열에서 특정 문자 제거
문제는 kotlin에 List : size의 확장 val 속성이 있기 때문입니다.
첫 번째 오류는 jvm의 두 가지 다른 kotlin "things"(메소드와 속성)가 동일하다는 것을 나타냅니다. 그리고 두 번째 오류는
ArrayList
에서val구현이 있기 때문입니다. 인터페이스의var필드를 통해 클래스Cars
setter와 getter를 모두 구현해야하지만 getter 만 구현합니다 (List val size
에서) ).해결책은 간단합니다. 인터페이스 속성을
val size: Int
로 변경하면됩니다.