泛型是什么

什么是泛型?

泛型就是一个标签:<数据类型>

泛型可以在编译阶段约束只能操作某种数据类型。

注意:JDK1.7开始之后,泛型后面的声明可以省略不写!!

泛型和集合都只支持引用数据类型,不支持基本数据类型。

泛型的好处:泛型在编译阶段约束了操作的数据类型,从而不会出现类型转换异常。体现的是Java的严谨性和规范性,数据类型,经常需要进行统一。

自定义泛型类

泛型类的概念:使用了泛型定义的类就是泛型类

泛型类的格式:

修饰符 class 类名<泛型变量>{

}

泛型变量建议使用E、T、K、V

需求:模拟ArrayList自定义一个集合MyArrayList集合。

泛型类的核心思想:是把出现泛型变量的地方全部替换成传输的真实数据类型。

自定义泛型方法

泛型方法:定义了泛型的方法就是泛型方法

泛型方法的定义格式:

修饰符 <泛型变量> 返回值类型 方法名称(形参列表){

}

注意:方法定义了是什么泛型变量,后面就只能用什么泛型变量

需求:给你任何一个类型的数组,都能返回它的内容

public class Main {

    public static void main(String[] args) {
	// write your code here
        Integer[] nums = {10,20,30,40,50};
        String s1 = arrToString(nums);
        System.out.println(s1);
        String[] strs = {"a","b","c","d"};
        String s2 = arrToString(strs);
        System.out.println(s2);
    }

    public static <T> String arrToString(T[] params){
        StringBuilder sb = new StringBuilder();
        if (params!=null && params.length>0){
            for (T temp:params
            ) {
                sb.append(temp);
            }
        }
        return sb.toString();
    }
}

泛型接口的使用

什么是泛型接口:使用了泛型定义的接口就是泛型接口

泛型接口的核心思想:在实现接口的时候传入真实的数据类型,这样重写的方法就是对该数据类型进行操作。

泛型接口的格式:

修饰符 interface 接口名称<泛型变量>{

}

需求:教务系统,提供一个接口可约束一定要完成数据的增删改查操作

// 泛型接口
public interface Data<E> {
    void add(E stu);
    void delete(E stu);
    void update(E stu);
    void query(int id);
}
package com.company;

import java.util.Date;

public class StudentData implements Data<Student> {
    @Override
    public void add(Student stu) {

    }

    @Override
    public void delete(Student stu) {

    }

    @Override
    public void update(Student stu) {

    }

    @Override
    public void query(int id) {

    }
}

泛型通配符和上下限

需求:开发一个极品飞车的游戏,所有的汽车都能一起参加比赛

package com.company;

import java.util.ArrayList;

public class GenericDemo {
    public static void main(String[] args) {
        ArrayList<BMW> bmws = new ArrayList<>();
        bmws.add(new BMW());
        bmws.add(new BMW());
        bmws.add(new BMW());
        run(bmws);  //  报错
        ArrayList<BENZ> benzs = new ArrayList<>();
        benzs.add(new BENZ());
        benzs.add(new BENZ());
        benzs.add(new BENZ());
        run(benzs);  // 报错
    }

    // 定义一个方法,可以让很多汽车一起进入参加比赛
    public static void run(ArrayList<Car> cars){

    }
}

class Car{

}
class BMW extends Car{

}

class BENZ extends Car{

}

注意:虽然BMW和BENE都集成了Car,但是ArrayList<BMW>和ArrayList<BENZ>与ArrayList<Car>没有关系的!泛型没有集成关系!

通配符:?,可以用在使用泛型的时候代表一切类型。E、T、K、V是在定义泛型的时候使用,代表一切类型。

package com.company;

import java.util.ArrayList;

public class GenericDemo {
    public static void main(String[] args) {
        ArrayList<BMW> bmws = new ArrayList<>();
        bmws.add(new BMW());
        bmws.add(new BMW());
        bmws.add(new BMW());
        run(bmws);  //  不报错
        ArrayList<BENZ> benzs = new ArrayList<>();
        benzs.add(new BENZ());
        benzs.add(new BENZ());
        benzs.add(new BENZ());
        run(benzs);  // 不报错
        ArrayList<Dog> dogs = new ArrayList<>();
        dogs.add(new Dog());
        dogs.add(new Dog());
        dogs.add(new Dog());
        run(dogs);  // 不报错
    }

    // 定义一个方法,可以让很多汽车一起进入参加比赛
    public static void run(ArrayList<?> cars){

    }
}

class Car{

}
class BMW extends Car{

}

class BENZ extends Car{

}

class Dog{

}

泛型上下限:

? extends Car:那么?必须是Car或者其子类。(泛型的上限)

? super Car:那么?必须是Car或者其父类。(泛型的下线,不是很常见)

package com.company;

import java.util.ArrayList;

public class GenericDemo {
    public static void main(String[] args) {
        ArrayList<BMW> bmws = new ArrayList<>();
        bmws.add(new BMW());
        bmws.add(new BMW());
        bmws.add(new BMW());
        run(bmws);  //  不报错
        ArrayList<BENZ> benzs = new ArrayList<>();
        benzs.add(new BENZ());
        benzs.add(new BENZ());
        benzs.add(new BENZ());
        run(benzs);  // 不报错
        ArrayList<Dog> dogs = new ArrayList<>();
        dogs.add(new Dog());
        dogs.add(new Dog());
        dogs.add(new Dog());
        run(dogs);  // 报错
    }

    // 定义一个方法,可以让很多汽车一起进入参加比赛
    public static void run(ArrayList<? extends Car> cars){

    }
}

class Car{

}
class BMW extends Car{

}

class BENZ extends Car{

}

class Dog{

}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值