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
}
我们有个错误。 为什么编译器不检查第一个例子中两个参数的匹配?抱歉问了个愚蠢的问题
# 1 楼答案
泛型是不变的
泛型是不变的,而不是协变的
这意味着,虽然你可以这样做:
你不能这样做:
所以
List<Dog>
不是List<Animal>
类型的。但是Dog
属于Animal
型当然,这是有道理的,因为
animals
会接受Cat
,但dogs
不会解释
在第一个代码中,您没有指定要使用的类型,例如:
所以你让编译器推断类型。它搜索
Thread
和StringBuilder
有共同点的类型,即Object
所以
T
决定Object
在那里,这很好:在第二个示例中,它不能选择
Object
,因为Collection<Object>
的行为与Collection<StringBuilder>
不同,因为泛型是不变的。因此,它无法找到匹配的类型,因此会发生错误另见Why are arrays covariant but generics are invariant?
# 2 楼答案
我想补充一点,在第二个代码段中做一个简单的更改可以纠正错误:
现在,Java编译器将再次推断
Object
:此外,还可以显式添加类型参数:
T => Object
进一步阅读:Upper Bounded Wildcards