泛型的使用和上下限

  • 约束数据类型,在集合;JDK5 之后出现的

  • E-element K-key V-value T-type

  • 泛型符号,只是一个占位符,给引用类型占个位置

  • 名称无要求,个数无要求,

  • 泛型符号 在本类中作为已知的类型来使用

  • 可以出现在类的声明处,接口的声明处,方法的声明处

1.2.1.泛型类

  • 泛型符号出现在类的声明处

泛型类的定义

public class GenericCustom<A, B, C> {
    private A a;
    private B b;
    private C c;

    public void method1(A a) {
    }

    /**
     * 静态方法中不能使用类的 泛型符号
     *
     * @param b
     */
    /*public static void method2(B b) {

    }*/
}

 


测试

/**
     * 1,泛型类
     */
    private static void method1() {
        //泛型符号对应的类型是在 创建对象的时候确定的;
        GenericCustom<Integer, String, Double> genericCustom = new GenericCustom<>();
        // 泛型符号只要不指定 统统当成Object来看
        GenericCustom genericCustom2 = new GenericCustom();
        //ArrayList是个泛型类
        ArrayList<String> strings = new ArrayList<>();
        strings.add("");
    }

 

 泛型接口

public interface GenericInter<T, K, V> {
    T method1(T t);

    K method2(K k);

    V method3(V v);
}


    //a,实现类直接确定泛型接口中的泛型符号类型

/**
 * 1, 实现类中直接确定类型
 */
public class GenericInterImpl1 implements GenericInter<String, Integer, Float> {
    @Override
    public String method1(String s) {
        return null;
    }

    @Override
    public Integer method2(Integer integer) {
        return null;
    }

    @Override
    public Float method3(Float aFloat) {
        return null;
    }
}


//b,实现类继续带上泛型符号



/**
 * 2,实现类继续带上泛型符号
 *
 * @param <T>
 * @param <K>
 * @param <V>
 */
public class GenericInterImpl2<T, K, V> implements GenericInter<T, K, V> {
    @Override
    public T method1(T t) {
        return null;
    }

    @Override
    public K method2(K k) {
        return null;
    }

    @Override
    public V method3(V v) {
        return null;
    }
}

//c,如果不指定 都当成Object来看

public class GenericInterImpl3 implements GenericInter {
    @Override
    public Object method1(Object o) {
        return null;
    }

    @Override
    public Object method2(Object o) {
        return null;
    }

    @Override
    public Object method3(Object o) {
        return null;
    }
}



//测试

   /**
     * 2,泛型接口
     */
    private static void method2() {
        GenericInterImpl1 genericInterImpl1 = new GenericInterImpl1();
        GenericInterImpl2<String, Integer, Float> genericInterImpl2 = new GenericInterImpl2<>();
        HashMap<Integer, String> hashMap = new HashMap<>();
    }



1.2.3.泛型方法

         

public class GenericMethod {

    /**
     * 在进行方法调用的时候 确定泛型方法中的类型
     * 在返回值前面 声明符号
     *
     * @param a
     * @param <A>
     */
    public <A, B> A method1(A a) {
        return a;
    }
    //静态方法中使用泛型
    public static <T, K, V> void method2(T t, K k, V v) {
    }
}

//测试
 /**
     * 3,泛型方法
     */
    private static void method3() {
        GenericMethod genericMethod = new GenericMethod();
        genericMethod.method1("abc");
        genericMethod.method1(123);
        genericMethod.method1(3.6);

        List<Integer> list = Arrays.asList(1, 2, 3, 34, 66, 88);
        System.out.println(list);
        List<String> strings = Arrays.asList("abc", "str", "java");
    }


可变长参数

 public static void main(String[] args) {
        List<Integer> list = Arrays.asList(1, 2, 3, 34, 66, 88);
        List<String> strings = Arrays.asList("a", "b", "c");
        method4(1, 2, 3, 4, 5);
    }
    /**
     * 可变长的参数,
     * 任意数据类型...
     * 传 0 或多个实际参数
     * 如果有可变长参数 必须出现在最后
     *
     * @param a 数组
     */
    public static void method4(double b, int... a) {
        System.out.println(a.length);
        System.out.println(": " + Arrays.toString(a));
    }

 

 


泛型上下限

public class Feeder {
    /**
     * 泛型的上限
     * ?通配符 表示任意类型
     * ? extends Animal表示只要是Animal或者Animal的子类型
     *
     * @param animals
     */
    public void feed(List<? extends Animal> animals) {
        for (Animal animal : animals) {
            animal.eat();
        }
    }
    /**
     * 泛型的下限
     * ? super Animal;表示是 Animal 或者Animal的父类型
     *
     * @param animals
     */
    public void getAnimal(List<? super Animal> animals) {
        for (Object animal : animals) {

        }
    }
}
//测试

 public static void main(String[] args) {
        Feeder feeder = new Feeder();
        List<Animal> animals = new ArrayList<>();
        animals.add(new Dog());
        animals.add(new Cat());

        List<Dog> dogs = new ArrayList<>();
        dogs.add(new Dog());
        dogs.add(new Dog());

        feeder.feed(dogs);
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值