Java 为什么可以';我们传递泛型类型t而不是?仿制药

Java 为什么可以';我们传递泛型类型t而不是?仿制药,java,generics,wildcard,Java,Generics,Wildcard,我有一个动物类和一个扩展了动物的猫类(猫是动物) 我定义了一个泛型类: public class Employee<T extends Animal> { T obj; Employee(T o){ obj=o; } String getName(Employee<T> a){ return "ok"; } } 公共类员工{ T-obj; 雇员(TO){ obj=o; } 字符串getName(员工

我有一个动物类和一个扩展了动物的猫类(猫是动物) 我定义了一个泛型类:

public class Employee<T extends Animal> {
    T obj;
    Employee(T o){
        obj=o;
    }
    String getName(Employee<T> a){
        return "ok";
    }
}
公共类员工{
T-obj;
雇员(TO){
obj=o;
}
字符串getName(员工a){
返回“ok”;
}
}
在测试类中,如果我编写此代码,它会给出以下错误:

Employee<Cat> cat = new Employee<Cat>(null);
Employee<Animal> animal = new Employee<Animal>(null);
animal.getName(cat);
Employee cat=新员工(空);
员工动物=新员工(空);
动物名称(猫);

但若我给getName方法打及格问号,它就行了,我认为Cat是一种动物(Cat类扩展了Animal)。知道我为什么要通过考试吗?如果你有一个方法
getName(Employee a)
,那么这个方法只接受
Employee
,这在
animal.getName(a)
的情况下意味着它必须是
Employee
(因为
animal
Employee

如果您还想接受泛型类型的子类,您必须说

String getName(Employee<? extends T> a)
String getName(Employee<? super T> a)

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

如果您还想接受泛型类型的子类,您必须说

String getName(Employee<? extends T> a)
String getName(Employee<? super T> a)

String getName(Employee虽然
Cat
Animal
兼容,
Employee
Employee
不兼容。它们是完全不同的类型。或者更一般地说,
A
A
不兼容,即使
T
U
兼容

之间有什么区别

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

另一方面,
允许将任何内容放入括号中,无论是
老虎
独角兽
,等等


还有,为什么
Employee
有一个类型为
Animal
的字段?这有点奇怪…只是说…

虽然
Cat
Animal
兼容,但
Employee
Employee
不兼容。它们是完全不同的类型。或者更一般地说,
a
不是c与
A
兼容,即使
T
U
兼容

之间有什么区别

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

另一方面,
允许将任何内容放入括号中,无论是
老虎
独角兽
,等等


另外,为什么
Employee
有一个类型为
Animal
的字段?这有点奇怪…只是说…

Integer不扩展Animal?对不起,忽略Employee a=new Employee(null);part您忘记包含错误。这与此相关:@kevin-method getName(Employee)在类型Employee不适用于EmployeeInteger不扩展Animal?抱歉,忽略Employee a=new Employee(null);partYou忘记包含错误。这是相关的:。@kevin-类型Employee中的方法getName(Employee)不适用于EmployeeInteger参数示例中的逻辑不正确,我的错误:)示例中的逻辑不好,我的逻辑不好:)