java – 通用方法.多个参数匹配

我无法弄清楚为什么这段代码没有错误.

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
}

我们有一个错误.
为什么编译器在第一个示例中没有检查两个参数的匹配?抱歉愚蠢的问题.

最佳答案
泛型是不变的

泛型是不变的,不是协变的.

这意味着,虽然你可以这样做:

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>类型.但是狗是动物类型.

当然这是有道理的,因为动物会接受猫,但狗不接受.

说明

在第一个代码中,您没有指定要使用的类型,例如:

compare<Foo>(...)

所以你让编译器推断出类型.它搜索Thread和StringBuilder共有的类型,即Object.

所以T解析为Object,这很好:

static int compare(Object t1, Object t2) {
    return 0;
}

在第二个示例中,它无法选择Object,因为Collection< Object>行为与Collection< StringBuilder>不同,因为泛型是不变的.因此无法找到匹配的类型,因此会发生错误.

另见Why are arrays covariant but generics are invariant?.

转载注明原文:java – 通用方法.多个参数匹配 - 代码日志