35

私はJavaジェネリックを学んでおり、この質問を自問しています。

これら 2 つのメソッド宣言の違いは何ですか?

public static void someMethod(List<? extends Number> numberList);

public static <E extends Number> void someMethod(List<E> numberList);
4

4 に答える 4

21

後者では、 のスコープ内のタイプsomeMethod、つまりへの参照がありますE。前者ではありません。

于 2013-02-20T12:02:23.537 に答える
13

主な違いは、後者はジェネリック メソッドであり、前者ではないことです。

たとえば、後者の方法では、次のようなことができます。

public static <E extends MyObject> void someMethod(List<E> someList) {
    E myObject = someList.iterator().next(); // this can actually lead to errors
    myObject.doSomething();                  // so treat it as an example
}

Eこれは、ジェネリック メソッド宣言の規則に準拠する任意の型に置き換えて、その型をメソッドで使用できることを意味します。

ただし、次のような型引数を使用してジェネリック メソッドを呼び出す必要があることに注意してください。

someClass.<MyArbitraryType>someMethod(someList);

ジェネリック メソッドの概要については、こちらを参照してください。

于 2013-02-20T12:19:08.093 に答える
5

2 番目のバージョンでは、次のようなことができます。

public static <E extends Number> void someMethod(List<E> numberList) {
  E number = numberList.get(0); 
  numberList.add(number);
}

これは最初のバージョンでは不可能です。

于 2013-02-20T12:09:15.820 に答える