かなり簡単な質問があります。でも検索しても答えが見つかりません。
これらの2つのコードフラグメントに違いはありますか?そして、違いは何ですか?
フラグメント1:
public class BinaryTree<T extends Comparable<? super T>> {
...
public <E extends T> void add(E value) {
...
}
public <E extends T> void add(E value, Node node) {
...
}
...
}
フラグメント2:
public class BinaryTree<T extends Comparable<? super T>> {
...
public void add(T value) {
...
}
public void add(T value, Node node) {
...
}
...
}
Fragment1は、パラメーター値がタイプTまたはタイプTのサブタイプのいずれかでなければならないことを明示的に指定します。
Fragment2は、パラメーター値がタイプTでなければならないことを指定しています。しかし、私の知識と経験から、ここでTのサブタイプを提供することもできると思います。フラグメント1と同じです。
これら2つのフラグメントの分解されたバイトコードを調べました。確かに違いがあります:
< public <E extends T> void add(E);
---
> public void add(T);
それはソースコードを反映しているだけです...
意味がわからない。また、違いを示すサンプルアプリケーションも見つかりません。
コメントありがとうございます。