为什么我们不能传递通用类型 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)
这四种情况中的哪一种是合适的取决于该方法实际需要做什么(以及这两个对象及其其他方法如何使用泛型类型)。
虽然 Cat
与 Animal
兼容,但 Employee<Cat>
与 Employee<Animal>
不兼容。它们是完全不同的类型。或者更笼统地说,即使 T
与 U
.
兼容,A<T>
也不兼容 A<U>
<?>
和<T>
有什么区别?
在 <T>
中,您有一个泛型类型参数 T
,在本例中为 Animal
。因此,该方法接受类型为 Employee<Animal>.
的参数 正如我所说,将 Employee<Cat>
放入 Employee<Animal>
是行不通的,这就是代码无法编译的原因。
另一方面,<?>
允许将任何内容放入括号中,无论是 Cat
、Dog
、Tiger
、Unicorn
, 随便.
P.S。为什么 Employee
有一个 Animal
类型的字段?有点奇怪...只是说...
我有一个动物 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)
这四种情况中的哪一种是合适的取决于该方法实际需要做什么(以及这两个对象及其其他方法如何使用泛型类型)。
虽然 Cat
与 Animal
兼容,但 Employee<Cat>
与 Employee<Animal>
不兼容。它们是完全不同的类型。或者更笼统地说,即使 T
与 U
.
A<T>
也不兼容 A<U>
<?>
和<T>
有什么区别?
在 <T>
中,您有一个泛型类型参数 T
,在本例中为 Animal
。因此,该方法接受类型为 Employee<Animal>.
的参数 正如我所说,将 Employee<Cat>
放入 Employee<Animal>
是行不通的,这就是代码无法编译的原因。
<?>
允许将任何内容放入括号中,无论是 Cat
、Dog
、Tiger
、Unicorn
, 随便.
P.S。为什么 Employee
有一个 Animal
类型的字段?有点奇怪...只是说...