Kotlinの単一の感嘆符


141

Kotlinで単一の感嘆符はどういう意味ですか?特にJava APIを使用しているときは、何度か見ました。しかし、ドキュメントでもStackOverflowでも見つかりませんでした。

回答:


155

それらはプラットフォームタイプと呼ばれ、Kotlinはその値が可能か不可能かを知らないことを意味し、nullnull可能かどうかはあなた次第です。

簡単に言えば、問題は、Javaからの参照がnullである可能性があり、Kotlinは設計上nullセーフであるため、ユーザーにすべてのJava値をnullチェックするか、安全な呼び出し(?.)またはnot-nullアサーション(!!)。これらは純粋なKotlinの世界で非常に便利な機能であり、Kotlin / Java設定で頻繁に使用しなければならない場合、災害になりがちです。

これが、私たちが根本的なアプローチをとり、Java相互運用に関してKotlinの型システムをよりリラックスさせた理由です。Javaからの参照には特別にマークされた型があります-Kotlinブログ


2
それはすべて良いと言ってやった。しかし、私はそれをいい感じにしないでくださいplatform types
JaydeepW

61

これは、プラットフォームタイプの表記法です。

T!TまたはT?」を意味します


なぜT手段「T!またはT?
ARST

T!null不可を意味するT?null可能を意味します。なぜKotlinはそれをしません...
ARST

4
明らかな理由により、最適なデフォルトは「null不可」であり、デフォルトが最短の型シグネチャであることが適切な設計であるためです。したがってT、「null不可」になり、残りは多かれ少なかれ恣意的
でした

13

で表記されたタイプ!は、プラットフォームタイプと呼ばれます。これは、Javaに由来するタイプであるため、ほとんどの場合、そうなりますnull。これは、Javaを呼び出すときにKotlinコンパイラーがデフォルトで推測するものです(最も基本的なケースでは、Javaメソッドに注釈付けてこれを回避できます)。特定のAPIが返されないことが確実にわかっている場合を除いて、プラットフォームタイプはnull許容型として処理する必要がありますnull。コンパイラーを使用すると、null許容型と非null型の両方の変数にプラットフォーム型を割り当てることができます。

プラットフォームタイプの表記

[...]

T!T or T?」を意味します[...]

プラットフォームのタイプを「不明なnull可能性のタイプ」と呼ぶことができます。また、感嘆符付きの型を独自の型に使用することはできません。これはKotlin構文の一部ではなく、単なる表記です。


「たぶん」のようなフレーズは役に立たない
ユアン

9

タイプ名または単一の感嘆符で終わるクラス名!は、プラットフォームタイプと呼ばれます。、Kotlinでは。ヌル可能性情報を含まない古いJavaコードでKotlinで作業しているときにそれらを見つけます。

例えば:

ヌル可能情報:ヌル可能タイプ

@Nullable StringJavaではString?、Kotlin と見なされます。

null以外の情報:null以外のタイプ

@NotNull StringJavaではString、Kotlin と見なされます。

情報なし:プラットフォームタイプ

StringJavaでの注釈なしはString!、Kotlin と見なされます。


プラットフォームタイプの扱い方

プラットフォームタイプは、null許容型または非null型として操作できます。コンパイラーでは、このタイプのすべてのメソッドを呼び出すことができます。それらをどのように使用するかはあなたの責任です。値がnullになる可能性があることがわかっている場合は、そのメソッドを呼び出す前にnullと比較する必要があります。nullでないことがわかっている場合は直接使用できますが、Javaの場合と同様に、null可能性についての想定が間違っていると例外が発生します。

Kotlinコードではプラットフォームタイプを宣言できないことに注意してください。これらはJavaコードからのみ取得されます。


継承とプラットフォームのタイプ

KotlinコードでJavaメソッドをオーバーライドするときに、パラメーターと戻り値の型をnull可能またはnull以外として宣言するオプションがあります。パラメーターを非ヌルにすることを決定した場合、Kotlinコンパイラーはこれらの非ヌルパラメーターに対して非ヌルアサーションを生成するため、これは賢明に選択する必要があります。そして、次回JavaからこのKotlinコードにアクセスしてnull値を渡すと、例外が発生します。

プラットフォームタイプに関するすべての疑問を解決するのに役立つことを願っています。


3

特にJava APIを使用しているときは、何度か見ました。

s1m0nw1で述べたように、T!はを意味しT or T?ます。次の質問は何T?ですか?これはhttps://kotlinlang.org/docs/reference/null-safety.htmlに文書化されています。Kotlinはnull、たとえばStringJavaとは異なり、特定の要素をにすることを許可していません

nullを許可するには、変数をnull可能な文字列として宣言し、String ?:

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

[...]

b?.length 

これは、bがnullでない場合はb.lengthを返し、それ以外の場合はnullを返します。この式のタイプはInt?です。


0

Kotlinのプラットフォームタイプからの抜粋:

タイプをオプションとして明示的に指定するだけでなく(たとえばPerson?)、Kotlinは、Platform Type代わりに単一の感嘆符(たとえばPerson!)を付けることによって指定された別の獣を表示します。この概念は、Javaなどのnullに対して安全でないプラットフォームからコードにアクセスする際の互換性の理由から作成されました。SomeType!Kotlinコンパイラは結果がnull可能かどうかを推測できないため、Javaライブラリを使用すると多くのメソッドがを返すことがよくあります。

例えば:

(Mutable)Collection<T>! 

単に次のことを意味します:「TのJavaコレクションは変更可能かどうか、null可能かどうか」。

お役に立てれば。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.