【Java】泛型类,接口,方法

泛型的作用:约束元素的类型 集合
泛型的符号:
T:type
E:element
K:Key
V:value

泛型符号是个占位符,给引用类型占位置
在使用的时候名称没有任何要求,ABCDEFG无所谓,个数也不要求
反省符号应用:

  1. 泛型类
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不能被接受到

你可能感兴趣的:(java,开发语言)