これらは Java Generics の例です。
次のようなシグネチャを持つメソッド:
<T> public T doSomething(T t);
は、T を任意のクラスに置き換えることができることを意味します。最初の部分は、T をワイルドカードとして使用することをコンパイラーに伝えます。public T は単なる戻り値であり、() の間の T は引数の型です。
これは、このメソッドを次のように呼び出すことができることを意味します。
final Integer someInt = doSomething(new Integer(5));
しかし、このようではありません:
final Integer someInt = doSomething(new Double(5));
引数と戻り値は同じでなければなりません。
T の値を制限することもできます。たとえば、次のようにします。
<T extends Number> public T doSomething(T t);
その場合、メソッドは Numer のサブクラスにのみ適用できるため、次のようになります。
final Integer someInt = doSomething(new Integer(5)); //allowed
final List someList = doSomething(new List()); //not allowed
? "? extends E" がある場合は、E のサブクラス (または E 自体) である任意のオブジェクトを意味します。