私はJavaジェネリックを学んでおり、この質問を自問しています。
これら 2 つのメソッド宣言の違いは何ですか?
public static void someMethod(List<? extends Number> numberList);
と
public static <E extends Number> void someMethod(List<E> numberList);
後者では、 のスコープ内のタイプsomeMethod
、つまりへの参照がありますE
。前者ではありません。
主な違いは、後者はジェネリック メソッドであり、前者ではないことです。
たとえば、後者の方法では、次のようなことができます。
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);
ジェネリック メソッドの概要については、こちらを参照してください。
2 番目のバージョンでは、次のようなことができます。
public static <E extends Number> void someMethod(List<E> numberList) {
E number = numberList.get(0);
numberList.add(number);
}
これは最初のバージョンでは不可能です。