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参数示例中的逻辑不正确,我的错误:)示例中的逻辑不好,我的逻辑不好:)