同等のVS <?Comparableを拡張>

Kinor:

次のコードについて:

public class Test <T extends Comparable>{
    public static void main(String[] args){
        List<String> lst = Array.asList("abc","def");
        System.out.println(func(lst));
    }
    public static boolean func(List<**here**> lst){
        return lst.get(0).compareTo(lst.get(1)) == 0;
    }
}

なぜ書いて「?Comparableを拡張し、」ここでコンパイルだろう、と「同等」を書くことがコンパイルされないでしょうか?

前もって感謝します。

ユージン:

ジェネリック医薬品であるので、これが起こる不変場合でもString ありComparable、意味は:

String s = "";
Comparable c = s; // would work

これらのジェネリック医薬品は機能しません。

List<Comparable> listC = List.of();
List<String> listS = List.of();

listC = listS; // will fail

そして、これは関係あるかに関係なく動作しないでしょうComparableとしますString

ときあなたはその方法の定義を変更します。

public static boolean func(List<? extends Comparable> lst) {
    ...
}

これは、次のことを言われている結合に延びているとのワイルドカードは型共変になります。

この意味は :

List<? extends Comparable> listC = List.of();
List<String> listS = List.of();

listC = listS; // would work here

それとも単純に言葉で、それはそれは意味List<String> のサブタイプであるList<? extends Comparable>

そこから、今支払うために小さな価格ですlistC今あるプロデューサーあなたはそれの要素を取ることができることを意味し、要素のは、あなたはそれに何かを置くことができません。

そのメソッドの定義が完全に正しいことになるので、このように書かれたとき、あなたはこのことを理解もした後、あなたは、まだ行われていません。

 public static <T extends Comparable<? super T>> boolean func(List<T> lst) {
      .....
 }

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=184473&siteId=1