0

の違いについて質問しました。

public static <T> void work(Class<T> type, T instance);

public static <T, S extends T> void work(Class<T> type, S instance);

知りたいことを正確に説明する必要があると思います。元の質問を更新するのは今回は適切ではないと思うので、ここで別の質問をします。

たとえば、次のようなMarshallermarshalで定義されたメソッドを呼び出すための単一のリフレクト メソッドを作成したいとします。

void marshal(Object element, ContentHandler handler)
void marshal(Object element, File output)
void marshal(Object element, Node node)

等々。

私が取り組んでいる方法の1つは

void marshal(Object jaxbElement, Class<?> targetType, Object target)

実装は簡単です

  1. とのようmarshal(Ljava/lang/Object;Ljava/lang/Class;)Vに見えるメソッドを見つけるObject.classtargetType
  2. elementとでメソッドを呼び出しtargetます。

したがって、単体テストコードは次のように呼び出すことができます

marshal(element, ContentHandler.class, handler);
marshal(element, File.class, new File("text.xml"));

marshalこの場合、メソッドをどのように定義すればよいですか? 間に違いはありますか

<T> marshal(Object element, Class<T> targetType, T target);

<T, S extends T> marshal(Object element, Class<T> targetType, S target)

?

回答ごとのその他のコメント

targetType正しい方法を探している高速で直接的な方法が必要だと思います。

がなければ、次のtargetTypeようなすべてのメソッドを反復する必要があります

for (Method method : Marshaller.class.getMethods()) {

    // check modifiers, name, return type, and so on.

    if (!method.getParameterTypes()[1].isAssignableFrom(target.getClass())) {
    }
}

これに別のバージョンを追加する方が良いと思います。:)

4

3 に答える 3

1

引数のセットに違いはありません。

<T> marshal(Object element, Class<T> targetType, T target);

<T, S extends T> marshal(Object element, Class<T> targetType, S target)

受け入れることができます。

したがって、API を作成する場合は、単純なもの、型パラメーターの少ないもの、つまり .xml のないものを優先する必要がありますS

于 2013-07-31T00:22:24.847 に答える
1

T でクラスを割り当てる場合は、引数でそれをフィードする必要がないため、<T, S extends T> marshal(Object element, S target)十分なはずです。しかし、のでS extends TSとして認識できますT

class だけにあるメソッドが特に必要でない限りS、それを省略して書くことができます

<T> marshal(Object element, T target)

ただし、ジェネリック メソッドを作成しているため、おそらく S を宣言する必要はありません。これには次の理由があります。

  • S のメソッドが T と異なる場合、S のいくつかの異なるクラスのメソッドを決定する良い方法はありません。共通のインターフェイスがない限り、共通のインターフェイスを として使用することもできますT

  • S のメソッドが異ならない場合、それをジェネリック オペランドとして具体的に示す理由はありません。

于 2013-07-30T08:42:07.443 に答える
1

クラスオブジェクトが必要な理由を知るのは難しいです。インスタンスがある場合はT、メソッドでこれを行うことができるからです。

Class<T> targetType = target.getClass(); // class may be derived from the instance    

ただし、本当にクラスに合格する必要がある場合は、これが必要だと思います。

<T> void marshal(Object element, Class<? super T> targetType, T target) {

}

を使用Class<? super T>することで、追加の汎用メソッド パラメータなしで、インスタンスのスーパー クラスである Class を柔軟に渡すことができます。

于 2013-07-30T08:48:00.330 に答える