2017-08-22 7 views
0

私はこのようなインタフェースを持って後方に影響を及ぼすどのようインタフェースの変更ジェネリック医薬品は、互換性

public interface EventListener<T extends Event> 

ここでの問題は、EventListenerは(もおよそEventを言うことができる)非常に一般名とクラスがあるということですEvent一般的な方法で書かれていません。私たちは非下位互換性の変更計画を行うことを許可されていないので

は、より一般的であることをインターフェイスの一般的な部分を変更することでした。だから基本的に私は2つの選択肢があります。どちらか、

a)は、スーパーインターフェース(例えば。GeneralEventListenerの追加のは、今の名前を気にしないようにしましょう)差別

public interface GeneralEventListener<T> 

Bせずにジェネリックを取ることができます)EventListenerはタイプTのオブジェクトを取ることを許可。

public interface EventListener<T> 

最初は許可された変更だと思います。しかし、これは不要な合併症のように思え、名前空間を汚染するでしょう。これまでの情報を除いて、制限をEventにする必要はありません。だから、私は "(b)バイナリの下位互換性がありますか?"

+0

これは役に立ちますか? https://stackoverflow.com/questions/43493452/can-i-recompile-a-public-api-with-a-sub-interface-and-keep-binary-compatibility/43503782#43503782 – Eugene

+0

@Eugeneそうでもありません。これはむしろ抽象的な方法に関するものでした。私はより一般的な部分のために許可されたタイプのより大きなサブセットを許可することを探しています。なぜこれがうまくいかないのかはかなり明らかですが、インタフェースでの型指定の一般的な制限を強制する上で大きなメリットはありません。私は非常にまれなケースがあるかもしれないと思いますが、一般的にこれはコードを再利用できないようにする有害な制限のようです。 – patrik

答えて

1

私の以前の回答は完全ではありませんでした。

これが問題の原因となります。バウンド型を使用しているため、コンパイラは型パラメータをバウンド型に置き換えます。

が見有無:ジェネリック医薬品は、コンパイル時に使用されているので、当然のことながらhttps://docs.oracle.com/javase/tutorial/java/generics/erasure.html

を、あなたの最善の策は、単純に変更を加えると、コードがコンパイルかどうかを確認することです。

+0

これは、Interfaceがパブリックなので、問題になる可能性があります。しかし、答えをありがとう。 – patrik

関連する問題