2017-09-22 35 views
1

私はsquareメソッドを提供する整数が欲しいとしましょう。Kotlinの拡張機能はどのように機能しますか?

Kotlin

fun Int.square() = this * this 

用法:

println("${20.square()}") 

DOC:

拡張機能は、実際に彼らは拡張するクラスを変更しないでください。拡張を定義することによって、クラスに新しいメンバを挿入するのではなく、この型の変数にドット表記で呼び出すことのできる新しい関数を作成するだけです。

私たちは、その拡張子を強調したい機能を静的に

派遣されている私の期待は、彼らは単にコンパイル時に拡張されたクラスのメンバ関数に追加することをしてきただろうが、それは彼らが明示的に否定するものですだから私の次の考えは、それがスカラ・インプリシットのような「ある種の」ものになる可能性があるということでした。

スカラ

object IntExtensions{ 
    implicit Class SquareableInt(i:Int){ 
     def square = i*i 
    } 
} 

使用:

import IntExtensions._ 

、次いで

println(f"${20.square}") 

DOC:

暗黙的なクラスは、クラスと暗黙的なメソッドのペアになっています。implciitメソッドは、そのクラスのコンストラクタを模倣しています。

生成された暗黙のメソッドは、暗黙のクラスと同じ名前になります。

しかし、scala implicitsは新しいクラスを作成するため、thisの使用が無効になります。

だから...どのようにそれはKotlinがクラスを拡張するのですか? 「呼び出し可能にする」とは私にはあまり言いません。

答えて

4

あなたのケースではKotlinは、名前だけでシンプルなutilsのクラスを作成し、 "ファイル名" Ktをと静的メソッドのJavaから "int型の広場(int型x)は"(Javaの擬似コード)

それが何かを見てこの

// filename int-utils.kt 
final class IntUtilsKt { 
    public static int square(int x) { 
     return x * x; 
    } 
} 

そして、この後

val result = 20.square()

に対するすべての呼び出しは、TRANSFになりますように(バイト・コード・レベルで)

val result = IntUtilsKt.square(20);

P.S. IDEAの "Show Kotlin byte-code"アクションを使用して自分で見ることができます

関連する問題