一般的な方法。複数の引数の試合

座っています:

エラーなしでこのコードの動作を行い、なぜ私が把握傾けます。

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>、ジェネリックであるため不変だから、試合には、このようにエラーが発生したことタイプを見つけることができません。

また、参照配列は共変ではなくジェネリックが不変でいるのはなぜ?

おすすめ

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