我无法弄清楚为什么这段代码没有错误.
static <T> int compare(T t1, T t2) {
return 0;
}
public static void main(String[] args) {
compare(new Thread(), new StringBuilder());
}
Run Code Online (Sandbox Code Playgroud)
因为我们有这样的事情:
static <T> void fromArrayToCollection(T[] a, Collection<T> c) {
return;
}
public static void main(String[] args) {
fromArrayToCollection(new Thread[] {}, new ArrayList<StringBuilder>()); // error
}
Run Code Online (Sandbox Code Playgroud)
我们有一个错误.为什么编译器在第一个示例中没有检查两个参数的匹配?抱歉愚蠢的问题.
泛型是不变的,不是协变的.
这意味着,虽然你可以这样做:
Dog dog = new Dog();
Animal animal = dog; // Dog works for Animal, classes are covariant
Run Code Online (Sandbox Code Playgroud)
你不能做这个:
List<Dog> dogs = List.of(new Dog());
List<Animal> animals = dogs; // Error, generics are invariant
Run Code Online (Sandbox Code Playgroud)
所以,List<Dog>是不是类型List<Animal>.但是Dog类型Animal.
当然这是有道理的,因为animals会接受Cats,但dogs不是.
在第一个代码中,您没有指定要使用的类型,例如:
compare<Foo>(...)
Run Code Online (Sandbox Code Playgroud)
所以你让编译器推断出类型.它搜索一个类型的Thread和StringBuilder有相同之处,这就是Object.
所以T解决到Object那里,这很好:
static int compare(Object t1, Object t2) {
return 0;
}
Run Code Online (Sandbox Code Playgroud)
在你的第二个例子中它不能选择Object,因为Collection<Object>行为不同Collection<StringBuilder>,因为泛型是不变的.因此无法找到匹配的类型,因此会发生错误.
另请参阅为什么数组是协变的但是泛型是不变的?.
| 归档时间: |
|
| 查看次数: |
80 次 |
| 最近记录: |