为什么我们不能传递通用类型 T 而不是传递?在仿制药中

Why can't we pass generic type T instead of ? in generics

我有一个动物 class 和一个猫 class 扩展了动物(猫是动物) 我定义了一个通用的 class:

public class Employee<T extends Animal> {
    T obj;
    Employee(T o){
        obj=o;
    }
    String getName(Employee<T> a){
        return "ok";
    }
}

在测试class中,如果我写这个,它会给我以下错误错误:

Employee<Cat> cat = new Employee<Cat>(null);
Employee<Animal> animal = new Employee<Animal>(null);
animal.getName(cat);

但是如果我为 getName 方法给出通过问号,它会起作用,我认为 Cat 是一种动物(Cat class extends Animal)。知道为什么我需要通过吗?而不是 T ?

如果你有一个方法getName(Employee<T> a)那么这个方法只接受Employee<T>,在animal.getName(a)的情况下意味着它必须是一个Employee<Animal>(因为animal 是一个 Employee<Animal>.

如果你也想接受泛型的子类,就得说

String getName(Employee<? extends T> a)

如果你也想接受泛型的超类,你必须说

String getName(Employee<? super T> a)

如果你真的不关心其他动物的通用类型,你可以说

String getName(Employee<?> a)

这四种情况中的哪一种是合适的取决于该方法实际需要做什么(以及这两个对象及其其他方法如何使用泛型类型)。

虽然 CatAnimal 兼容,但 Employee<Cat>Employee<Animal> 不兼容。它们是完全不同的类型。或者更笼统地说,即使 TU.

兼容,A<T> 也不兼容 A<U>

<?><T>有什么区别?

<T> 中,您有一个泛型类型参数 T,在本例中为 Animal。因此,该方法接受类型为 Employee<Animal>. 的参数 正如我所说,将 Employee<Cat> 放入 Employee<Animal> 是行不通的,这就是代码无法编译的原因。

另一方面,

<?> 允许将任何内容放入括号中,无论是 CatDogTigerUnicorn , 随便.

P.S。为什么 Employee 有一个 Animal 类型的字段?有点奇怪...只是说...