泛型的作用:约束元素的类型 集合
泛型的符号:
T:type
E:element
K:Key
V:value
泛型符号是个占位符,给引用类型占位置
在使用的时候名称没有任何要求,ABCDEFG无所谓,个数也不要求
反省符号应用:
public class GenericCustom<A,B,C> {
}
在本类中,可以把泛型符号当成已知类型来用
public class GenericCustom<A,B,C> {
private A a;
private B b;
private C c;
public GenericCustom() {
}
public GenericCustom(A a, B b, C c) {
this.a = a;
this.b = b;
this.c = c;
}
}
泛型的具体类型在创建对象的时候决定,如果不指定的话全都当成Object,所以说静态方法不能使用泛型,因为他可以直接用类调用
class GTest{
public static void main(String[] args) {
GenericCustom<String,Double,Long> g = new GenericCustom<>();
}
}
public interface GenericInterface<A,B,C> {
void method1(A a);
void method2(B b);
void method3(C c);
}
接口泛型的确认有两种,一种是实现类直接确定泛型,如果不指定就全当成Object
class GenericImpl1 implements GenericInterface<String,Double,Long> {
@Override
public void method1(String s) {
}
@Override
public void method2(Double aDouble) {
}
@Override
public void method3(Long aLong) {
}
}
第二种情况就是实现类也不确定泛型,就和泛型类一样在new对象的时候才能确定
class GenericImpl2<A,B,C> implements GenericInterface<A,B,C>{
@Override
public void method1(A a) {
}
@Override
public void method2(B b) {
}
@Override
public void method3(C c) {
}
}
public class GenericMethod {
public static <T> void method1(T t){
}
}
在调用的时候传入什么类型就是什么类型
泛型方法可以是静态的
正常情况下我们我们写程序会这么写
public abstract class Animal {
public abstract void eat();
}
class Dog extends Animal{
@Override
public void eat() {
System.out.println("狗吃骨头");
}
}
class Cat extends Animal{
@Override
public void eat() {
System.out.println("猫吃鱼");
}
}
class Feeder{
public void feed(List<Animal> animals){
for (Animal animal : animals) {
animal.eat();
}
}
}
class ATest{
public static void main(String[] args) {
Feeder feeder = new Feeder();
ArrayList<Animal> animals = new ArrayList<>();
animals.add(new Dog());
animals.add(new Cat());
feeder.feed(animals);
}
}
饲养员Feeder可以操作动物们eat
但是当我有一个Dog的List,我们是不可以把他传入到feed方法的,因为我们feed传入的是Animal类型,所以必须接收Animal类型的List,解决方法是使用通配符
class Feeder{
public void feed(List<? extends Animal> animals){
for (Animal animal : animals) {
animal.eat();
}
}
}
这样就提升了泛型的上限,可以用他的子类的List来调用了
而提升下线就是用super
public void method1(List<? super Dog> Dogs){}
他只能取到Dog及其父类型,所以接去到的是个Object集合,理所当然的,Cat不能被接受到