TのJavaはComparableを拡張しますか?スーパーT



Java T Extends Comparable



このタイプパラメータ(タイプパラメータ)は、JDKツールまたはメソッドでよく見られます。次の例のコレクションの並べ替え方法:

public static void sort(List list) { list.sort(null) }

多くの人が最初に関数のシグネチャを見て、いくつかの疑問があります、なぜあまりにも多くのトラブルに巻き込まれるので、ステートメントはそれを好きではありません



なぜこんなに複雑な形を宣言しなければならないのか

読んだり、検索したりした後、この宣言の目的を完全に理解してください。



1.および単純な違い

タイプTはComparableインターフェースを実装する必要があり、このタイプのインターフェースはTです。

同等のタイプTはインターフェースを実装する必要があり、このインターフェースは任意のタイプTまたは親クラスです。そのようなステートメントの後、インスタンス間、インスタンス間、およびTのインスタンスの親クラスのインスタンス間で、サイズを相互に比較できます。

2.例1

例を見る多くの場所で見つけることができます



public class Test1 { public static void main(String[] args) { Demo p1 = null // will be given } } class Demo {}

コードはIDEで提供されます。
エラー:パラメータータイプjava.util.GregorianCalendarが変数Tタイプのスコープ内にありません:(11、14)java。

なぜ上記のエラーを報告するのでしょうか?グレゴリオ暦はComparableインターフェースを実装していないためです。
上記のコードが通常の操作を簡単に変更する場合:

public class Test1 { public static void main(String[] args) { Demo p1 = null } } class Demo {}

なぜ今は問題ないのですか?グレゴリオ暦はCalendarクラスを継承し、CalendarはComparableインターフェースを実装しているためです。

上記の例では、それを確認できることは明らかです。このステートメントは、T型を受け入れることができるだけでなく、親型Tも受け入れることができるので、引数の型パラメーターは渡されますか?制限が少なくなり、APIの柔軟性が向上します。

3.例2

別の例を見てください

public class Test2 { public static void sort1(List list) { Collections.sort(list) } public static void sort2(List list) { Collections.sort(list) } public static void t1() { List animals = new ArrayList() animals.add(new Animal(20)) animals.add(new Animal(30)) List dogs = new ArrayList() dogs.add(new Dog(5)) dogs.add(new Dog(10)) sort1(animals) // sort1 (dogs) will complain sort2(animals) sort2(dogs) } } class Animal implements Comparable { public int age public Animal(int age) { this.age = age } public int compareTo(Animal other) { return this.age - other.age } } class Dog extends Animal { public Dog(int age) { super(age) } }

上記の2つのクラスの例:Animalクラスは、Comparableインターフェイス、DogAnimal継承クラスを実装します。メソッドパラメータsort1 パラメータメソッドはsort2 です。

sort1メソッドのみListソートするリストのタイプ、for Listタイプはソートできません。
sort2メソッドはメソッドシグネチャパラメータであるため、List TypeまたはList Typeのどちらであっても、可能です。