私はJavaジェネリックスを学習しており、私は自分自身にこの質問をします。Javaジェネリックメソッド宣言
これら2つのメソッド宣言の違いは何ですか?後者において
public static void someMethod(List<? extends Number> numberList);
と
public static <E extends Number> void someMethod(List<E> numberList);
私はJavaジェネリックスを学習しており、私は自分自身にこの質問をします。Javaジェネリックメソッド宣言
これら2つのメソッド宣言の違いは何ですか?後者において
public static void someMethod(List<? extends Number> numberList);
と
public static <E extends Number> void someMethod(List<E> numberList);
あなたはsomeMethod
の範囲、即ちE
内の型への参照を持っています。前者ではあなたはしません。
最初のメソッド宣言を使用しても、新しいものをリストに追加することはできません。たとえば、これはコンパイルされません。
public static void someMethod(List<? extends Number> numberList, Number number) {
numberList.add(number);
}
第二は、あなたがこれを行うことを可能にする一方で:これは最初のバージョンでは不可能である
public static <E extends Number> void someMethod(List<E> numberList) {
E number = numberList.get(0);
numberList.add(number);
}
:ようにあなたが何かを行うことができます番目のバージョンでは
public <T extends Number> static void someMethod(List<T> numberList, T number) {
numberList.add(number);
}
を。
主な違いは、後者がの一般的な方法であるということです。
したがって、たとえば、あなたがこのような何かを行うことができ、後者の方法では:
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);
あなたは一般的な方法hereの素敵な概要を見つけることができます。
java Se 7以降では、この 'someClass.somemethod(someList);を呼び出すことができます、私はse7コンパイラatmを持っていません。 – ZeDonDino
それを指摘してくれてありがとう。 –
私はse7コンパイラatmも持っていません。 –
2番目のコードを使用すると、 'someMethod'のコードでEを参照できます。 – Oren