5

ジェネリックパラメーター型をとるメソッドがあります。私が持っているシナリオは、このメソッドがさまざまなパラメータータイプで呼び出されることです。

class something{
    public void someMethod(){
        List<A> listA = ....; //Class A have a field String Id;
        List<B> listB = ....; //Class B haave a field String Id;

        testMethod(listA);
        testMethod(listB);
    }

    private <T> void testMethod( List<T> list ){
            for( T event : list ){
                //TODO (something like): event.getId();
            }
        }
}

上記のコードでは、すべてのパラメーターはになりますList<someObjectType>。すべてのオブジェクトタイプには共通のフィールドがあり、その値をフェッチするにはゲッターを使用する必要があります。メソッド定義は一般的ですが、どうすればこれを実現できますか?

4

6 に答える 6

8

メソッドを持つ共通のインターフェースを持って実装しAます:BgetID

interface SomeInterface {
    String getID();
}

その後、あなたは持つことができます:

private <T extends SomeInterface> void testMethod(List<T> list) {
    for (T event : list) {
        // now you can use `event.getID()` here
    }
}
于 2012-12-04T20:16:00.583 に答える
1

これはできません。instanceof互換性のないインターフェイスを持つ2つの異なるリストを、メソッドで同じ方法で処理することはできません。

public void testMethod(List<? extends Object> list) {
  if(list.get(0) == null) return;
  if(list.get(0) instanceof A) {
    // Do the A stuff
  } else {
    // Do the B stuff
  }
}
于 2012-12-04T20:04:41.217 に答える
1

有界型なしでこのようなジェネリックメソッドを作成しても意味がありません。Tはどのタイプにもバインドされていないため、リスト内のオブジェクトで特定のインターフェイスを使用することはできません。したがって、testMethodで任意のタイプのオブジェクトのリストを取得する場合は、List<?>代わりにを使用する必要があります。

于 2012-12-04T20:12:07.040 に答える
1

共通のクラス/インターフェースを拡張するTを使用して、このようにメソッドを定義しますBaseType

private <T extends BaseType> void testMethod( List<T> list ){
   for( T event : list ){
       //TODO (something like): event.getId();
   }
}

例:

public void someMethod() {
    List<Integer> listA = Arrays.asList( new Integer[] {1, 4, 9} );
    List<Double> listB = Arrays.asList( new Double[] {1.5, 4.2, 9.3} );;
    testMethod(listA);
    testMethod(listB);
}

private <T extends Number> void testMethod( List<T> list ){
    for( T event : list ) {
        // Note intValue() method is being called here which is provided
        // in the base class Number that is being extended by T
        System.out.println(event.intValue());
    }
}   
于 2012-12-04T20:15:37.520 に答える
1

他の答えが言ったように、あなたはいくつかのインターフェースによってタイプパラメータをバインドする必要があります。Tしかし、それを使用している目的のために、実際に:を持っている必要はありません。

private void testMethod(List<? extends SomeInterface> list) {
    for (SomeInterface event : list) {
        // now you can use `event.getID()` here
    }
}
于 2012-12-04T22:20:54.800 に答える
0

私はあなたが何を望んでいるのか本当に理解しているかどうかわかりません。しかし、知っている場合は、たとえば文字列をリストに格納し、toUpperCase()メソッドを使用したい場合は、それをキャストするだけではどうでしょうか。

于 2012-12-04T20:06:35.723 に答える