2016-08-12 6 views
3

インタフェース型の引数をメソッドに渡す必要がある場合は、2つのimplを使用できます。境界型パラメータを使用する場合または直接インタフェースを入力

有界型パラメータを使用します

public static <I extends InterfaceObj> void isTrue(boolean expression, I interfaceobj) { 
     if(!expression){ 
      throw new RunTimeException(interfaceobj); 
     }} 

は、そうでない場合は、インターフェイスのタイプを使用できます。その後、私はInterfaceObjを実装するクラスを持っている場合、私は最初にそれを使用することができます

public static void isTrue(boolean expression, InterfaceObj interfaceobj) { 
     if(!expression){ 
      throw new RunTimeException(interfaceobj); 
     } 
    } 

をし、 2つ目の例では、私はその違い、有利な点、不利な点などを見ていません。

  • それぞれの場合の違いは何ですか?
  • いつどちらかを使用する方が良いでしょうか? Oracleの

答えて

2

あなたはパラメータ化された型に型引数として を使用することができます種類を制限したい場合があるかもしれません。たとえば、数字に作用するメソッド は、数値 またはそのサブクラスのインスタンスを受け入れるだけでよい場合があります。これは、有界型パラメータのためのものです。機能的に

、それはまた、唯一の番号またはそのサブクラスのインスタンスを受け入れるようにしたいかもしれません、パラメータの型としてインターフェイスを持つ以来、まったく同じことです。

技術的には、コンパイルされたクラスが異なる必要があるため、技術的にはわずかです。

あなたのケースでは、あまり冗長ではないので、ワイルドカードを使用せずにrawインターフェイスタイプを使用することをお勧めします。


これは、メソッドの有界型パラメータが無意味であることを意味しません。 これは、複数のバウンド型のパラメータを使用する場合には、本当に便利です。
InterfaceObjOtherInterfaceObjの2つの指定されたタイプの両方に属しているという条件で、メソッドがパラメータを受け入れるとします。 、あなたを複数のバウンド型パラメータを持つ

public static void isTrue(boolean expression, MyTwoInterfacesObj interfaceobj) { 
    if (!expression) { 
     throw new RuntimeException(); 
    } 
} 

:インターフェイスタイプで


は、あなたがこれらの二つのインターフェースを拡張し、別のインターフェイスを作成する必要があり、この必要性に対処するために、あなたのような、あなたの方法でそれを使用します追加のインタフェースを作成する必要はありません。あなたがそのように指定することができます。それらの両方にパラメータの種類を制限することは少し厄介で、二つのインターフェースで

public static <I extends InterfaceObj & OtherInterfaceObj> void isTrue(boolean expression, I interfaceobj) { 
    if (!expression) { 
     throw new RuntimeException(); 
    } 
} 

、3つのまたは4つのインターフェイスと、それらの複数の可能なミックスで想像してみてください。

2

私は違い、有利な点および不利な点は1つまたは 以外は表示されません。

あなたは忘れてしまったと思いますコレクション!あなたがコレクションのパラメータを持っている場合は有界型パラメータの本当の利点は、この方法でプレイ

に出番

は、それはあなただけList<InterfaceObj> list = new ArrayList<InterfaceObj>();

public static void processList(List<InterfaceObj> input){ 
    //... 
} 
ようinstatiatedたリストを渡すことができます

しかし、有界のパラメータ化されたジェネリックを使用する場合、入力としてすべての下のリストを渡すことができます

List<InterfaceObj> list = new ArrayList<InterfaceObj>(); 
List<SubInterfaceObj> list = new ArrayList<SubInterfaceObj>(); 
List<SubSubInterfaceObj> list = new ArrayList<SubSubInterfaceObj>(); 

public static void processList(List<? extends InterfaceObj> input){ 
    //... 
} 
1

最初のバージョンがの場合はとなり、メソッドのコードではとなります。の正確なサブタイプは渡されましたが、2番目のバージョンは渡せません。

メソッドがパラメータと同じ型のリストを返した場合、その違いがわかります。バージョン1はList<I>を返すことができます。リストの型はパラメータの(サブ)型と同じですが、バージョン2は型がスーパータイプであるList<InterfaceObj>のみを返します。

関連する問題