TのJavaはComparableを拡張しますか?スーパーT
Java T Extends Comparable
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インターフェースを実装しているためです。
上記の例では、それを確認できることは明らかです。
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のどちらであっても、可能です。