[kotlin] 코 틀린의 느낌표

Kotlin에서 느낌표 하나가 무엇을 의미합니까? Java API를 사용할 때 특히 몇 번 보았습니다. 그러나 설명서 나 StackOverflow에서 찾을 수 없었습니다.



답변

그것들은 플랫폼 유형 이라고 불리며 Kotlin은 그 값의 유무를 알지 못하며 null널 입력 가능 여부를 결정하는 것은 귀하의 책임입니다.

간단히 말해서, 문제는 Java에서 오는 모든 참조가 null 일 수 있으며 Kotlin은 의도적으로 null 안전하므로 사용자가 모든 Java 값을 null 확인하거나 안전한 호출 ( ?.) 또는 null이 아닌 어설 션 ( !!). 순수한 Kotlin 세계에서 매우 편리한 기능은 Kotlin / Java 환경에서 너무 자주 사용해야 할 때 재난으로 변하는 경향이 있습니다.

우리는 급진적 인 접근을했다하고 상호 운용성 자바에 올 때 코 틀린의 타입 시스템이 더 완화 만든 이유입니다 : 지금 자바에서 오는 참조가 특별히 표시 한 유형 – 코 틀린 블로그


답변

플랫폼 유형에 대한 표기법입니다 .

T!T또는 T?


답변

로 표기된 유형을 플랫폼 유형! 이라고하며 , 이는 Java에서 제공 되는 유형 이므로 대부분 가능할 수 있습니다 . Java를 호출 할 때 Kotlin 컴파일러가 기본적으로 추론하는 것입니다 (가장 기본적인 경우 Java 메소드에 주석 수 있습니다 ). 특정 API가 결코 반환하지 않는다는 것을 확실히 알지 못하면 플랫폼 유형을 nullable 유형으로 처리해야합니다 . 컴파일러를 사용하면 플랫폼 유형을 널 입력 가능 유형과 널이 아닌 유형의 변수에 지정할 수 있습니다.nullnull

플랫폼 유형에 대한 표기법

[…]

T!T or T?“[…] 의미

플랫폼 유형을 ” 알 수없는 널 입력 가능 유형 “이라고 할 수 있습니다. 또한 느낌표로 표시된 유형을 자신의 유형에 사용할 수 없으며 Kotlin 구문의 일부가 아니며 표기법 일뿐 입니다.


답변

단일 느낌표로 끝나는 유형 이름 또는 클래스 이름 을 Kotlin에서 플랫폼 유형! 이라고 합니다. nullable 정보가 포함되지 않은 오래된 Java 코드로 Kotlin에서 작업 할 때 찾을 수 있습니다.

예를 들면 다음과 같습니다.

널 입력 가능 정보 : 널 입력 가능 유형

@Nullable StringJava에서는 String?Kotlin 이 간주 합니다.

널이 아닌 정보 : 널이 아닌 유형

@NotNull StringJava에서는 StringKotlin 이 간주 합니다.

정보 없음 : 플랫폼 유형

String자바에서 주석이없는 것은 String!Kotlin에 의해 간주됩니다 .


플랫폼 유형을 다루는 방법?

널 유형 또는 널이 아닌 플랫폼 유형으로 작업 할 수 있습니다. 컴파일러를 사용하면이 유형의 모든 메소드를 호출 할 수 있습니다. 사용 방법은 귀하의 책임입니다. 값이 널일 수 있다는 것을 알고 있으면, 메소드를 호출하기 전에 값을 널과 비교해야합니다. 그것이 null이 아니라는 것을 알고 있다면 직접 사용할 수 있지만 Java에서와 같이 null 허용에 대한 가정이 잘못되면 예외가 발생합니다.

Kotlin 코드로 플랫폼 유형을 선언 할 수 없으며 Java 코드에서만 제공됩니다.


상속 및 플랫폼 유형

Kotlin 코드에서 Java 메소드를 대체하는 동안 매개 변수 및 리턴 유형을 널 입력 가능 또는 널이 아닌 것으로 선언하는 옵션이 있습니다. 매개 변수를 널이 아닌 것으로 설정하면 Kotlin 컴파일러는 이러한 널이 아닌 매개 변수에 대해 널이 아닌 어설 션을 생성하므로이를 현명하게 선택해야합니다. 그리고 다음에 Java에서이 Kotlin 코드에 액세스하고 null 값을 전달하면 예외가 발생합니다.

플랫폼 유형에 대한 모든 의심을 없애는 데 도움이되기를 바랍니다.


답변

Java API를 사용할 때 특히 몇 번 보았습니다.

s1m0nw1에서 언급했듯이 T!의미 T or T?합니다. 다음 질문은 무엇 T?입니까? 이것은 https://kotlinlang.org/docs/reference/null-safety.html에 잘 정리되어 있습니다 . 코 틀린는 특정 요소가 될 수 없습니다 null예를 들어, String자바와는 달리,

널을 허용하기 위해 변수를 널 입력 가능 문자열 (문자열?)로 선언 할 수 있습니다.

var b: String? = "abc"
b = null // ok

[…]

b?.length 

b가 null이 아니면 b.length를 반환하고, 그렇지 않으면 null을 반환합니다. 이 표현식의 유형은입니다 Int?.


답변

Kotlin의 플랫폼 유형에서 발췌 :

유형을 선택적으로 (예 Person?🙂 명시 적으로 지정하는 것 외에도 Kotlin Platform Type은 하나의 느낌표 (예 :)를 지정하여 이라고하는 또 다른 짐승을 제시합니다 Person!. 이 개념은 Java와 같은 널 안전하지 않은 플랫폼에서 코드에 액세스 할 때 호환성을 위해 작성되었습니다. Java 라이브러리를 사용할 때 SomeType!Kotlin 컴파일러가 결과가 널 입력 가능 여부를 유추 할 수 없기 때문에 많은 메소드 가을 리턴하는 경우가 종종 있습니다.

예를 들면 다음과 같습니다.

(Mutable)Collection<T>! 

T의 Java 콜렉션은 변경 가능하거나 널 입력 가능 또는 불가능 “을 의미합니다.

도움이 되었기를 바랍니다.


답변