座っています:
エラーなしでこのコードの動作を行い、なぜ私が把握傾けます。
static <T> int compare(T t1, T t2) {
return 0;
}
public static void main(String[] args) {
compare(new Thread(), new StringBuilder());
}
私たちはこのようなものを持っている場合理由は次のとおりです。
static <T> void fromArrayToCollection(T[] a, Collection<T> c) {
return;
}
public static void main(String[] args) {
fromArrayToCollection(new Thread[] {}, new ArrayList<StringBuilder>()); // error
}
私たちは、エラーが発生しています。なぜ最初の例では、両方の引数のないコンパイラチェックが一致していますか?愚かな質問申し訳ありません。
Zabuza:
ジェネリック医薬品は不変です
ジェネリック医薬品は不変ではなく、共変。
あなたはこのような何かを行うことができますが、ことをこの意味:
Dog dog = new Dog();
Animal animal = dog; // Dog works for Animal, classes are covariant
あなたはこれを行うことはできません。
List<Dog> dogs = List.of(new Dog());
List<Animal> animals = dogs; // Error, generics are invariant
そうList<Dog>
でないタイプのList<Animal>
。しかし、Dog
型ですAnimal
。
以来、もちろんこれは、理にかなってanimals
受け入れるCat
のは、しかし、dogs
ではありません。
説明
:あなたの最初のコードでは、次のような、使用するタイプを指定していませんでした
compare<Foo>(...)
タイプ推測コンパイラを聞かせてあなたはとても。これは、タイプを検索Thread
し、StringBuilder
ある、共通しているがObject
。
だから、T
に解決さObject
が、罰金があります:
static int compare(Object t1, Object t2) {
return 0;
}
2番目の例では、選ぶことができないObject
ので、Collection<Object>
異なる振る舞いはCollection<StringBuilder>
、ジェネリックであるため不変。だから、試合には、このようにエラーが発生したことタイプを見つけることができません。