回答:
それらはプラットフォームタイプと呼ばれ、Kotlinはその値が可能か不可能かを知らないことを意味し、null
null可能かどうかはあなた次第です。
簡単に言えば、問題は、Javaからの参照がnullである可能性があり、Kotlinは設計上nullセーフであるため、ユーザーにすべてのJava値をnullチェックするか、安全な呼び出し(
?.
)またはnot-nullアサーション(!!
)。これらは純粋なKotlinの世界で非常に便利な機能であり、Kotlin / Java設定で頻繁に使用しなければならない場合、災害になりがちです。これが、私たちが根本的なアプローチをとり、Java相互運用に関してKotlinの型システムをよりリラックスさせた理由です。Javaからの参照には特別にマークされた型があります-Kotlinブログ
で表記されたタイプ!
は、プラットフォームタイプと呼ばれます。これは、Javaに由来するタイプであるため、ほとんどの場合、そうなりますnull
。これは、Javaを呼び出すときにKotlinコンパイラーがデフォルトで推測するものです(最も基本的なケースでは、Javaメソッドに注釈を付けてこれを回避できます)。特定のAPIが返されないことが確実にわかっている場合を除いて、プラットフォームタイプはnull許容型として処理する必要がありますnull
。コンパイラーを使用すると、null許容型と非null型の両方の変数にプラットフォーム型を割り当てることができます。
[...]
T!
「T or T?
」を意味します[...]
プラットフォームのタイプを「不明なnull可能性のタイプ」と呼ぶことができます。また、感嘆符付きの型を独自の型に使用することはできません。これはKotlin構文の一部ではなく、単なる表記です。
タイプ名または単一の感嘆符で終わるクラス名!
は、プラットフォームタイプと呼ばれます。、Kotlinでは。ヌル可能性情報を含まない古いJavaコードでKotlinで作業しているときにそれらを見つけます。
例えば:
@Nullable String
JavaではString?
、Kotlin と見なされます。
@NotNull String
JavaではString
、Kotlin と見なされます。
String
Javaでの注釈なしはString!
、Kotlin と見なされます。
プラットフォームタイプは、null許容型または非null型として操作できます。コンパイラーでは、このタイプのすべてのメソッドを呼び出すことができます。それらをどのように使用するかはあなたの責任です。値がnullになる可能性があることがわかっている場合は、そのメソッドを呼び出す前にnullと比較する必要があります。nullでないことがわかっている場合は直接使用できますが、Javaの場合と同様に、null可能性についての想定が間違っていると例外が発生します。
Kotlinコードではプラットフォームタイプを宣言できないことに注意してください。これらはJavaコードからのみ取得されます。
KotlinコードでJavaメソッドをオーバーライドするときに、パラメーターと戻り値の型をnull可能またはnull以外として宣言するオプションがあります。パラメーターを非ヌルにすることを決定した場合、Kotlinコンパイラーはこれらの非ヌルパラメーターに対して非ヌルアサーションを生成するため、これは賢明に選択する必要があります。そして、次回JavaからこのKotlinコードにアクセスしてnull値を渡すと、例外が発生します。
プラットフォームタイプに関するすべての疑問を解決するのに役立つことを願っています。
特にJava APIを使用しているときは、何度か見ました。
s1m0nw1で述べたように、T!
はを意味しT or T?
ます。次の質問は何T?
ですか?これはhttps://kotlinlang.org/docs/reference/null-safety.htmlに文書化されています。Kotlinはnull
、たとえばString
Javaとは異なり、特定の要素をにすることを許可していません
nullを許可するには、変数をnull可能な文字列として宣言し、String ?:
var b: String? = "abc" b = null // ok
[...]
b?.length
これは、bがnullでない場合はb.lengthを返し、それ以外の場合はnullを返します。この式のタイプは
Int?
です。
Kotlinのプラットフォームタイプからの抜粋:
タイプをオプションとして明示的に指定するだけでなく(たとえば
Person?
)、Kotlinは、Platform Type
代わりに単一の感嘆符(たとえばPerson!
)を付けることによって指定された別の獣を表示します。この概念は、Javaなどのnullに対して安全でないプラットフォームからコードにアクセスする際の互換性の理由から作成されました。SomeType!
Kotlinコンパイラは結果がnull可能かどうかを推測できないため、Javaライブラリを使用すると多くのメソッドがを返すことがよくあります。
例えば:
(Mutable)Collection<T>!
単に次のことを意味します:「TのJavaコレクションは変更可能かどうか、null可能かどうか」。
お役に立てれば。
platform types