私はKotlinを学んだし、私は、この日読んでいるアクションでKotlinを。拡張機能と標準ライブラリの改善についての章を読んで、私はによって公開されたさまざまな行動について読んString.split
JavaとKotlinの間のオーバーロード:私はそれが区切り文字ベースおよび正規表現ベースの間に明確な、より型導かれた分離に向かって移動するのは非常に良いアイデアだと思いますオーバーロード。
このことについて、私は上記きた本はと言うKotlinは混乱の方法を隠し、名前の代替いくつかのオーバーロードされた拡張機能として提供してsplit
異なる引数を持っています。
拡張機能は、「私は既存のクラスにメソッドを追加することができますどのように」questioneに応じます。一方で、私はそれがにpossibileです方法を見つけ出すことはできません非表示にする Javaの標準ライブラリで提供された方法。
私は、簡単なコードを書いて、いくつかの試みをした、と私は気づい
val ks = "Pietro Martinelli"
持っていますks::class.qualifiedName == "kotlin.String"
val ks = "Pietro Martinelli"
持っていますks::javaClass.name == "java.lang.String"
- 上記の値を渡す
ks
Javaメソッドに、受信したパラメータをx
有しているx.getClass().getName() == "java.lang.String"
(予想通り) String js = "Pietro Martinelli"
(Javaコードでは)はjs.getClass().getName() == "java.lang.String"
予想通り、- 上記通過
js
Kotlin方法値を、受信したパラメータをy
有しているy::class.qualifiedName == "kotlin.String"
とy.getClass().getName() == "java.lang.String"
(これまでに予想されるように)
だから、:それ(私が言わせて)いるようだ何かの魔法は、私が使用している場合に発生String
KotlinからJavaへKotlinの値と、前後を。私が正しくundestand場合は、String
Kotlinにおけるリテラルはのインスタンスであるkotlin.String
が、それらはに囲まれているJava型透過的にJavaメソッド呼び出しのために使用されています。この方法では、Kotlinライブラリは向上させることができますString
影響を与えることなく、経験をjava.lang.String
通常のJava:[java.lang.]String.split
メソッドがされている隠された Kotlinの開発者が見るという意味でKotlinコードに[kotlin.]String
インスタンスとその方法を。
だから、2(関連)質問:1.私の理解、右ですか?そして、より多く2.興味深いことは、コンパイラによる代わりに魔法プットの唯一のようなものだ知っている String
のインスタンスなどの特殊なタイプを、別のクラスのインスタンスの後ろにそれらをラップし、またはいくつかのより一般的なアプローチがある/メカニック許可すること何らかの方法隠すクラスのいくつかの方法で、我々は、拡張機能の整備士を通じてメソッドを追加することができます同じように?だから、非常に危険なことが、私はそれがコンパイラの問題だけだと思うが、私はそれが問題価値があると思うので、それは、あまりにも、強力です。
ヒントやフィードバックのために事前にありがとうございます。
残念ながら、これはコンパイラの魔法です。これらは呼ばれてマッピングされたタイプ、およびコンパイラは、彼らがJVMにコンパイルした場合、実行時に、彼らは通常のJava型のインスタンスであるにも関わらず、インターフェースを変更したKotlinの種類としてKotlinコードに表示されるようにそれを作るために彼らに特別な治療を与えます。
以外にString
、最も顕著な例は、おそらく完全に新しいインターフェースの二つの層を持っているコレクションは、読み取り専用と可変変種のために、それらに適用されます。