2013-02-20 11 views
28

私はJavaジェネリックスを学習しており、私は自分自身にこの質問をします。Javaジェネリックメソッド宣言

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

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

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

2番目のコードを使用すると、 'someMethod'のコードでEを参照できます。 – Oren

答えて

19

あなたはsomeMethodの範囲、即ちE内の型への参照を持っています。前者ではあなたはしません。

0

最初のメソッド宣言を使用しても、新しいものをリストに追加することはできません。たとえば、これはコンパイルされません。

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); 
} 
+0

もう1つ使用しないでください。 – ZeDonDino

+0

追加する要素がタイプEまたはサブクラスである限り、リストに要素を追加できます。 –

+0

私はJava SE 6を使用していますが、それは不可能です。 – ZeDonDino

9

主な違いは、後者がの一般的な方法であるということです。

したがって、たとえば、あなたがこのような何かを行うことができ、後者の方法では:

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の素敵な概要を見つけることができます。

+1

java Se 7以降では、この 'someClass.somemethod(someList);を呼び出すことができます、私はse7コンパイラatmを持っていません。 – ZeDonDino

+0

それを指摘してくれてありがとう。 –

+1

私はse7コンパイラatmも持っていません。 –