先に結論
初心者は気にするな。Eとして扱え。
それだけだとアレなので
これは「下限付きワイルドカード」と呼ばれる総称型の指定方法の1つです。
<? super E>
は、クラスEとその親クラスが総称型として利用できる、という意味になります。
Eの子孫クラスは利用できません。
具体的な例を挙げると、こんな感じ。
List<Number>
のオブジェクトがあるとします。このオブジェクトに対してsortメソッドを利用する際、引数には Comparator<? super Number>
のオブジェクトを入れることになります。
クラスNumberは親クラスがObjectです。なので、Comparator<Object>
かComparator<Number>
のオブジェクトを引数として取ることができます。
逆に、Numberの派生クラスの1つにIntegerがあります。Comparator<Integer>
のオブジェクトは引数として取ることができません。
このように、sortする際に親クラスの扱いで処理したい場合に有効です。
実際にそんな場面が頻繁に存在するかと言うと、そんなことはないわけですが。
上記の説明で少しもピンとこない場合
今は特に気にしなくて良いです。総称型におけるワイルドカードの概念はJavaの中ではかなりの高難易度で、初心者が理解できなくても仕方がないし、理解しなくても困りません。
特に List<E>
のsortの中身をラムダ式で書くのであれば利用する際は、通常利用であればラムダ式の引数の型は常に E
なので何も気にすることはないです。
深く知りたい場合は
「java 上限つきワイルドカード」「java 下限つきワイルドカード」などのキーワードで検索すると分かりやすい(ただし熟練者にとって)解説が色々出てきます。
ただ、初心者は特に知らなくて良い概念だとは思っています。
少なくとも、関数インターフェースが100%理解できるようになるまでは詳しく知らなくてもいいんじゃないかと思います。