第15章 泛型

泛型的好处

(1)编译时,检查添加元素的类型,提高了安全性

(2)减少了类型转换的次数,提高效率

  • 不使用泛型时:本类-->Object-->本类//需要类型转换

  • 使用泛型时:本类-->本类-->本类//不需要类型转换,提高效率

  • 泛型小练习

    对ArrayList中的元素进行排序,先判断名字,在名字相同的情况下再判断出生日期

public class B {
    @SuppressWarnings({"all"})
    public static void main(String[] args) {
        ArrayList<Employee> employee = new ArrayList<>();
        employee.add(new Employee("jack",10000,new MyDate(2001,12,11)));
        employee.add(new Employee("rose",10000,new MyDate(2001,12,11)));
        employee.add(new Employee("jack",10000,new MyDate(2000,12,10)));
        employee.sort(new Comparator<Employee>() {
            @Override
            public int compare(Employee emp1, Employee emp2) {
                int i = emp1.getName().compareTo(emp2.getName());
                if (i != 0){
                    return i;
                }
               return emp1.getBirthday().compareTo(emp2.getBirthday());
            }
        });
        System.out.println(employee);
    }
}
class Employee{
    private String name;
    private int age;
    private MyDate birthday;

    public Employee(String name, int age, MyDate birthday) {
        this.name = name;
        this.age = age;
        this.birthday = birthday;
    }

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }

    public MyDate getBirthday() {
        return birthday;
    }

    @Override
    public String toString() {
        return "\nEmployee{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", birthday=" + birthday +
                '}';
    }
}
class MyDate implements Comparable<MyDate>{
    private int year;
    private int month;
    private int day;

    public MyDate(int year, int month, int day) {
        this.year = year;
        this.month = month;
        this.day = day;
    }

    public int getYear() {
        return year;
    }

    public int getMonth() {
        return month;
    }

    public int getDay() {
        return day;
    }

    @Override
    public String toString() {
        return "MyDate{" +
                "year=" + year +
                ", month=" + month +
                ", day=" + day +
                '}';
    }

    @Override
    public int compareTo(MyDate o) {
        int i = this.year - o.getYear();
        if (i != 0){
            return i;
        }
        int i2 = this.month-o.getMonth();
        if (i2 != 0){
            return i2;
        }
        return this.day - o.getDay();
    }
}

 自定义泛型

  • 注意细节

(1)普通成员可以使用泛型

(2)使用泛型的数组不能进行初始化

(3)静态方法中不能使用类的泛型

(4)泛型类的类型,是在创建对象时确定的

(5)如果在创建对象时,没有指定类型,默认为Object

自定义泛型接口

  • 细节

(1)接口中,静态成员也不能使用泛型

(2)泛型接口的类型,在继承或者实现接口时确定

(3)没有指定类型,默认为Object

自定义泛型方法

  • 细节

(1)泛型方法,可以定义在普通类中,也可以定义在泛型类中

(2)当泛型方法被调用时,类型会确定

(3)泛型方法可以使用类声明的泛型也可以使用自己的泛型

(4)泛型方法和方法使用泛型不同:

public<E> void eat<E e>{}
//方法使用泛型:
public void eat<E>{}

本章作业

 

① 定义泛型类DAO<T>,在其中定义一个Map成员变量,Map的键为String类型,值为T类型

分别创建以下方法:

(1)public void save(String id,T entity):保存T类型的对象到Map成员变量中

(2)public T get(String id):从map中获取id对应的对象

(3)public void update(String id,T entity):替换map中key为id的内容,改为entity对象

(4)public List<T>list():返回map中存放的所有T对象

(5)public void delete(String Id):删除指定对象

②定义一个user类:

该类包含:private成员变量(int类型)id,age,(String类型)name

③创建DAO类的对象,分别调用其save、get、update、list、delete方法来操作User对象

public class B {
    @SuppressWarnings({"all"})
    public static void main(String[] args) {
        Dog<User> userDog = new Dog<>();
        userDog.save("001",new User(1,18,"jack"));
        userDog.save("002",new User(2,19,"rose"));
        userDog.save("003",new User(3,20,"karry"));
        List<User> list = userDog.list();
        list.remove(1);
        System.out.println(list);
        userDog.update("004",new User(1,21,"ROY"));
        List<User> list1 = userDog.list();
        System.out.println(list1);
    }
}
class User {
    private int id;
    private int age;
    private String name;

    public User(int id, int age, String name) {
        this.id = id;
        this.age = age;
        this.name = name;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "\nUser{" +
                "id=" + id +
                ", age=" + age +
                ", name='" + name + '\'' +
                '}';
    }
}
class Dog<T>{
    private Map<String, T> map = new HashMap<>();
    public T get(String id){
        return map.get(id);
    }
    public void update(String id,T entity){
        map.put(id,entity);
    }
    //遍历map,将所有的value封装到arraylist
    public List<T> list(){
        List<T> list = new ArrayList<>();
        Set<String> keySet = map.keySet();
        for(String key : keySet){
            list.add(get(key));
        }
        return list;
    }
    public void delete(String Id){
        map.remove(Id);
    }
    public void save(String id,T entity){
        map.put(id, entity);
    }
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值