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) {
.....
}