2016-03-31 3 views
5

Javaライブラリのメソッドをオーバーライドしています。この関数のパラメータには、@NonNullと注釈が付けられています。ただし、このメソッドが呼び出されると、パラメータはしばしばnullの値となります。私がKotlinのメソッドをオーバーライドすると、@NonNullアノテーションを尊重し、そのパラメータをnull不可能なものとしてマークする必要があります。もちろん、Kotlinはパラメータがnull値で入ってくると実行時に例外をスローします。 Kotlinのメソッドをオーバーライドして@NonNullアノテーションを無視できる方法はありますか?Javaメソッドをオーバーライドして、パラメータのNULL可能性を変更するにはどうすればよいですか?

特に、私はAndroid用のappcompatライブラリを使用しています。この方法は、KotlinにAppCompatActivity.java

@CallSuper 
public void onSupportActionModeFinished(@NonNull ActionMode mode) { 
} 

オーバーライドである:

override fun onSupportActionModeFinished(mode: ActionMode) { 
    super.onSupportActionModeFinished(mode) 
} 
+0

あなたが、それはまたCallSuper注釈が付いていますので、NULL以外のパターンがある従うことが重要である理由。ヌル値を渡した場合、アノテーションは値がヌルでないことを確認するためのものであるため、スーパーメソッドにチェックはありません。あなたはほぼ確実にNPEで終わるでしょう。このメソッドをフレームワーク外で明示的に呼び出さない場合、フレームワークはこの注釈を尊重するため、null値は決して与えられません。 – zgc7009

+0

ライブラリはそのメソッドを呼び出していて、自分のコードではなくヌル値を渡しています。ライブラリはそれ自身の注釈を破っています。 Javaでオーバーライドしてnullをスーパーメソッドに渡すと、NPEは発生しません。 – brain

+0

世界で何が、ちょうど奇妙です。 – zgc7009

答えて

4

はKotlinコンパイラによってNULL可能注釈処理を抑制するための簡単な方法はないように思えます。回避策として

、あなたはJavaで@Nullableアノテーションで中間派生クラスを作ることができます。Kotlinコンパイラは同じコード要素に@Nullable@NonNullの両方を見たときに何のNULL可能注釈がなかったかのように振る舞います。その後、Kotlinでサブクラス化してください。例:

はJavaで @NonNullパラメータを持つクラスを考えてみましょう:

Kotlinは注釈を理解
abstract class Base { 
    public abstract void f(@NonNull String str); 
    //... 
} 

f(str: String)、タイプがnullです。

今、JavaでBaseを拡張メソッドをオーバーライドし、Intermediate中のパラメータに@Nullable注釈を追加します。Intermediateについては

abstract class Intermediate extends Base { 
    @Override 
    public abstract void f(@Nullable String str); 
} 

は、Kotlinはf(str: String!)見て、パラメータがplatform typeを持っている、つまり、そのNULL値を許可するかどうか不明です。

その後、あなたはIntermediateのKotlinサブクラスでNULL可能パラメータを宣言することができるようになります:

class Derived(): Intermediate() { 
    override fun f(url: String?) { ... } 
} 
+2

このような場合に警告を表示または無視する手段を追加していただければ幸いです。 1つのパラメータを修正するために中間クラスを作成するのは苦痛です。 – brain

関連する問題