学習Kotlin(3)とnull許容型システムを入力

1.システム

型システムを使用して、コンパイラは意味のない、無効、エラーコードタイプの不一致などを確認することがあります。
また、静的型チェックもコンパイラに有用な情報を提供することができます。

そして、Javaに比べ、Kotlinは唯一のタイプのパッケージング、元の型を削除し、舞台をコンパイルするコンパイラは、自分のパフォーマンス、基本的な種類に開梱梱包の種類を最適化するようにコンパイラにしましょう。
Kotlin null許容型が導入され、それがヌル値に可能である個別のNULL可能タイプで表され、それはヌルおよび非ヌル参照の間に明確な線を挙げることができるように分割することができます。
図3-2に示すkotlin型階層:
ここに画像を挿入説明
あなたが見ることができ、文字列、INT、MyClassのは、その非空のタイプを、継承された、彼らは文字列に箱詰めすることができますか?、のInt?、MyClassの?コンパイル時に、彼らはまた、文字列、int型、MyClassのに開梱することができるが、時間はストレージ容量のスタックに保存されます。

私たちは、空の型の定義を示すことができる場合は、それが大幅にコンパイル時や実行時のヌルポインタ例外でコンパイラを削減します。

kotlinに===同じメモリ空間が&&値が同一である指摘したか否かを判定する==同じ値か否かを判断する、例えば:

//例子1:
 val a:Int = 1000
 val b:Int = 1000
 >>>a === b 
 true
 >>>a == b
 true

//例子2:
 val a:Int? = 1000
 val b:Int? = 1000
 >>>a == b
 true
 >>>a === b
 flase

最初の例では、aおよびbはintは、アンパックintへのコンパイル時に、「1000」の値は、スタック領域の存在であり、そしてそれはまた、2つの基準点B、有するので、メモリがそのbはスペースは同じです。
第二の例、及びB値intですか?それらはメモリアドレスを指すように、コンパイル時に、彼らは同じではない、ヒープ上に割り当てられた異なる空間における2つの異なるオブジェクトとして理解されます。

Java配列型T [](長い[]内のint [] ...})、 Kotlinに、一方直接配列アレイ型で表される、例えば、我々は、各要素の初期値をINT 5素子のアレイを構築し私は、私を*として:

val squareArray = Array(5, {i -> i * i})
>>> squareArray.forEach(::println)
0
1
4
9
16

Javaは、新しいxxxArrayて配列のKotlin上で8つの基本タイプが定義されました。(このようなBooleanArrayとして、ByteArrayの、DoubleArray ...)

2. NULL可能タイプ

Javaはオプションで使用されているorElse空の刑を宣告されたが、見苦しい使用します。
使用中のKotlin ?.安全调用符?:Elvis操作符例として:

fun main(args: Array<String>){
  println(getLength(null))
  println(getLength("hello"))
}

fun getLength(s: String?):Int{
   return s?.length ?: 0       //如果s不为空,就返回 s.length,否则就返回0
}

3.セキュリティ演算子

ヌルタイプはNothing?
Kotlin、マルチユースに?、あなたは空の宣告操作の多くを回避できます。

val str:String = null        //编译报错,因为String不能为空
var nullStr:String? = null       //编译通过
null == null                 //返回true
null is Any                  //返回false
null is Any?                 //返回true
var a = null  
>>>a                        //输出null
a = 1                       //编译报错,因为null的类型Nothing? 而1是Int,不能向上转型

我々は、直接、そのプロパティのnull許容型またはメソッドを呼び出すことはできません、例えば、以下のコードを直接与えられます。

nullStr.length        //编译报错

nullStr?.length       //要用安全调用符 ?. 编译才正确

!!非空断言Null許容型は、そのようなオブジェクトは、メソッドや属性メンバーを呼び出すことができます。

nullStr = null
>>>nullStr!!.lenth //如果nullStr为空,则抛出空指针异常
....Expection

4.特殊タイプ

4.1ユニットタイプ

でKotlin Unitにおける型実装とJava voidと同じ機能
ここでは、ユニットの定義です

public object Unit{                 //Unit类型是一个object对象类型
  override fun toString() = "kotlin.Unit"  //如果println输出对象类型,就是"kotlin.Unit" 
}

関数が値を返さないとき、私たちは、ユニットを使用するユニットを返却して表示し、またはユニットのための関数の戻り値の型を宣言しないでください
コンパイラはそれを推測しますので、私たちのために、かなりの単位がデフォルトです。

何も?タイプと4.2何もありません

あなたは関数の戻り値は常にnullになりたい場合は、Javaでは、あなたは、関数の戻り値の型は、ボクシングのクラスの空隙で書くことができVoid、かつリターンヌル
、これはVoidコリンに対応するであろうNothing?、アクセスすることができる唯一のリターン値がヌルである
、システムのKotlinタイプにNothingインスタンス化することができない、その説明において下、プライベートコンストラクタです。
**関数の戻り値は、関数を表すものは、戻り値になることはありませんであれば。** Javaとのように、ボイド

何も私たちは、例外をスローする関数の値を返すことはできません

違いとユニットの何もない:
ユニットは、戻り値の型であるUnit
が、何も戻り値の任意の型なしです

?何もないと何も違い:
Nothing?ナル以外の種類は、他の缶が割り当てられていません。
そしてNothing割り当てることはできません。

4.3どれとどれ?タイプ

Any?空の型階層がルートである、どれ?どれ親です。

>>> 1 is Any         //Int类型的1是Any
true
>>> 1 is Any?        //Int类型的1是Any?
true
>>>null is Any       //null不是Any类型
false
>>> null is Any?     //null是Any?
true
>>>Any() is Any?     //Any()是Any?类型
true

型変換型検出器と

一般的には、必要なときに、コンパイラや検査が自動的に変換されるため、Kotlin変換演算子で表示を使用する必要はありません。

5.1オペレータであります

オペレータAはXの特定のタイプと互換性のあるオブジェクトを確認することができている(XがタイプAであるか、またはXがクラスを派生型)、およびJava、及びinstanceOf()ほぼ
kotlinに、我々が使用することができ、使用することができるされています!is

5.2オートスイッチ

自動変換kotlinこの姿勢です。

   fun strlen(ani: Any): Int {
        return when (ani) {
            is String -> ani.length
            is Number -> ani.toString().length
            is Char -> 1
            is Boolean -> 1
            else -> {
                print("Not a string")
                -1
            }
        }
    }
    ...
    
     val len = strlen("abc")
     print(len) //3
     val lens = strlen(1)
     print(lens) //1

オペレーターとして5.3

オペレータが明示的な型変換の参照タイプを実行するために使用される
変換は、変換のタイプと互換性がある場合にそうでない場合は、成功したようにでしょう?オペレータは、NULLを返します

    open class Foo       //父类Foo
    class Goo : Foo()      //子类Goo
    
    val foo = Foo()
    val goo = Goo()
    foo as Goo  //运行报错,父类型不能强制转化为子类型
    foo as? Goo  //返回null
    goo as Foo //子类型可以转化为父类型

強力なローター親クラスレープの原則の違反が交換されます。

公開された248元の記事 ウォン称賛99 ビュー10万+

おすすめ

転載: blog.csdn.net/rikkatheworld/article/details/102831276