Share
Embed
Annotations specific to the Java platform.
tebasakyu
August 22, 2017
Transcript
22 slides
-
自己紹介 • 鈴木 誠 (Makoto Suzuki) ◦ 娘: 遙華(Haruka) 5ヶ月
• Monstar Lab, Inc. • Android Engineer • Twitter: @tebasakyu -
• JvmField • JvmMultifileClass • JvmName • JvmOverloads • JvmStatic
• JvmSuppressWildcards • JvmSynthetic • JvmWildcard • PurelyImplements • Strictfp • Synchronized • Throws • Transient • Volatile これで全部です。 -
• JvmField • JvmMultifileClass • JvmName • JvmOverloads • JvmStatic
• JvmSuppressWildcards • JvmSynthetic • JvmWildcard • PurelyImplements • • • Throws • • これだけ書きました。 -
• JvmField • JvmMultifileClass • JvmName • JvmOverloads • JvmStatic
• JvmSuppressWildcards • JvmSynthetic • JvmWildcard • PurelyImplements • • • Throws • • よく使いそうなのはこの辺りですね。 -
• JvmField • • JvmName • JvmOverloads • • JvmSuppressWildcards
• • • • • • Throws • • 今日はこの辺りを話します。 -
@JvmName • クラス名、メソッド名にJavaからの実行用別名をつける View.kt @file:JvmName("View") package com.xxx.extensions fun View.toVisible() {
this.visibility = View.VISIBLE } -
MainActivity.java ViewKt.toVisible(textView); textView.setVisibility =View.GONE; MainActivity.java View.toVisible(textView); textView.setVisibility = android.view.View.GONE; •
@JvmName無しの場合 拡張関数の命名規則を”com.xxx.extentions.<拡張元クラス名>”などとしている場合、 下手に別名を付けると面倒なこともある。 -
@JvmOverloads • デフォルト値付き引数を持つメソッドのオーバーロードを生成 する @JvmOverloads fun hoge( bool: Boolean =
false ) { } 生成されたJavaコード public void hoge() { hoge(false) } // アノテーションを付けないと出てこない。 public void hoge(boolean bool) { } // 無しの場合はこちらだけ。 -
@JvmSuppressWildcards • ジェネリクスのワイルドカードを利用不可にする interface Foo class Bar: Foo { fun
hoge(list: List<@JvmSuppressWildcards Foo>) { } } ▪Javaから実行する new Bar().hoge(new ArrayList<Foo>()); // OK new Bar().hoge(new ArrayList<Bar>()); // NG (Barは<? extends Foo>だから) -
@Throws • Kotlinから検査例外を明示させる ◦ Kotlinは検査例外が無いので、try-catchを強制できない class Hoge { @Throws(IOException::class) fun
fuga() { throw IOException() } } ▪Javaから実行 hoge.fuga(); // コンパイルエラー(「try-catchしなさい」) -
@JvmField • プロパティアクセスを可能にする ◦ 通常はgetter/setterを介してアクセスさせる class data { @JvmField val
hoge = "fuga" // プロパティアクセス可 val fuga = "hoge" // getFuga() / setFuga() でアクセスする } -
@JvmStatic • JavaからStatic呼び出しを可能にする companion object { @JvmStatic fun newInstance() :
MainFragment = MainFragment() } ▪Javaから実行 アノテーションあり:MainFragment.newInstance(); アノテーションなし:MainFragment.Companion.newInstance(); -
Fuga.kt @file:JvmName("Util") @JvmMultifileClass package com.xxx fun fuga() { } MainActivity.java
com.xxx.Util.hoge(); com.xxx.Util.fuga(); -
@JvmWildcard • ジェネリクスのワイルドカードをつける ◦ List<String> → List<? extends String> ◦
不要な場合(finalなど)、デフォルトでワイルドカード無しに なる fun foo(l: List<String>) // in Java: List<String> (String is final) fun foo(l: List<@JvmWildcard String>) // in Java: List<? extends String> 引用元:https://goo.gl/ETK3Sm -
@PurelyImplements • Java側がKotlinのために付ける(っぽい) • 型パラメータをプラットフォーム型にしない @PurelyImplements("kotlin.collections.MutableList") public class MyPureList<T> extends
AbstractList<T> { ... } ▪Kotlinから実行 MyPureList<Int>().add(null) // NG アノテーション無しだとOKになってしまう MyPureList<Int?>().add(null) // OK -
@JvmSynthetic • 公式に説明が無い • stack overflowで「I advice to not using
it in normal "user" code.」と言われている。 ◦ https://goo.gl/Z1CSy