2015-11-22 14 views
5

コトルは、visibility modifiersextension functionsの2つの特徴を備えています。ドキュメントには、Extensions are resolved staticallyと記載されています。しかし、これは拡張機能内のクラスメンバーの可視性にとってどういう意味ですか?コードがコンパイルされません保護機能は拡張機能でアクセスできませんか?

class A { protected val a = "Foo" } 
fun A.ext() { print(a) } //Raises: Cannot access 'a': it is 'protected' in 'A' 

class B { val b = "Bar" } 
fun B.ext() { print(b) } //Compiles successful 

はのは、以下の不自然な例を考えてみましょう。保護されたメンバーは、クラスを拡張するときにアクセスできないと思われます。

だから静的に解決ん拡張機能はJavaでこのような何かを持つための糖衣構文であることを意味:

public static void ext(A receiver){ System.out.print(receiver.a); } 

protectedメンバにアクセスできない理由が説明するだろう。一方、拡張機能ではthisを使用することができます(省略することもできます)。

拡張機能の正確な範囲は何ですか?

答えて

6

正しいですが、拡張機能/プロパティは静的なJVMメソッドにコンパイルされています。一般に、それらは拡張しているクラス以外のパッケージの別のクラスに置かれているため、VMアクセシビリティルールのためにそのクラスの保護されたメソッドを呼び出すことはできません。また、protectedの可視性definition(クラスとそのサブクラスに表示されます)と一貫しています。拡張関数はサブクラスではなく、拡張しているクラスのサブクラスでも定義されていません。

拡張機能の本体でthisを使用または省略できるという事実は構文上の特徴に過ぎません。コンパイラはJVMメソッドの最初のパラメータをロードするために必要な命令を発行します。

関連する問題