2017-11-24 6 views
1

私はいくつかのクラスがある場合:私はそれに対してコードを構築しているバイナリや他の人としてこれをコンパイルしている場合は戻り値の型を厳密なサブタイプに変更し、バイナリ互換性を保持できますか?

import java.util.Date; 
public final class Foo { 
    private Date date; 
    public Date getDate(){ return date; } 
} 

、私はその後、バイナリ互換性を壊すことなく、これを行うことができますか?

import java.sql.Date; 
public final class Foo { 
    private Date date; 
    public Date getDate(){ return date; } 
} 

java.sql.Datejava.util.Dateのサブクラスであることに注意してください。

つまり、誰かが前に私のライブラリに対してjava.util.Dateを返すようにgetDateメソッドをオーバーライドFooのサブクラスをコンパイルしている可能性が(その後、私はソース互換性が壊れているだろう、私はクラスの決勝を宣言していなかった、と私には明白と思われます。そのコードはもはや私の最新バージョンに対してをコンパイルすることはありません。しかし、ソースの互換性を壊すことは、バイナリ互換性も壊れていることを意味しますかjava.sql.Datejava.util.Dateことどんな行動を破るないと仮定 -

+0

[互換性チェッカーツール](https://lvc.github.io/japi-compliance-checker/)を実行して、実行するかどうかを確認できます。 –

+0

どのようなバイナリ互換性がありますか?コンパイルされたもの、置き換えられるものは何ですか?どのようにロードするのですか? –

答えて

0

そのサブクラスに対して適切に機能し続けなければならないjava.util.Date不利に働くあなたが持っている任意のコードを(つまりは、Scalaのように、他の言語で保持していません)。

すなわち、java.sql.Datejava.util.Date(例えばgetHours())のいくつかのオーバーライド非推奨の方法でjava.lang.IllegalArgumentExceptionをスロー。あなたが疲れているはずの1つの方法は、toInstant()です。これは現代のJavaアプリケーションでは非常に有用かもしれませんが、ちょうどjava.lang.IllegalArgumentExceptionjava.sql.Dateに投げます。

+0

これはバイナリ互換性と同じではありません。 'getDate'を呼び出そうとしたときに' LinkageError'または 'NoSuchMethodError'のいずれかを投げた新しいライブラリに対して実行されていたコードについて、 –

0

ベストな方法は、自分でテストすることです。公式documentationからの抜粋です:

13.4.15です。メソッドの結果タイプ

は、メソッドの結果の型を変更、または 無効と結果の種類を交換する、または結果タイプで、ボイドを置き換えるには、古いメソッドを削除して新しいメソッドを追加すること の複合効果を持っています新しい結果 タイプまたは新たに無効な結果(13.4.12参照)。

13.4.12。クラスからメソッドやコンストラクタを削除する方法とコンストラクタ宣言

この方法または コンストラクタを参照任意の既存のバイナリとの互換性 を破ることができます。既存のバイナリからのそのような参照 がリンクされている場合、NoSuchMethodErrorがスローされる可能性があります。このようなエラーは、 の一致するシグネチャと戻り値の型を持つメソッドが スーパークラスで宣言されていない場合にのみ発生します。

私は、これはあなたが戻り値の型を変更している場合、それは古いタイプのサブタイプである場合に関係なく、あなたが13.4に従って、古い方法を削除して新しいメソッドを追加していることを意味していることである読み方法。12このメソッドまたはコンストラクタを参照する既存のバイナリとの互換性を破ることができます。

関連する問題