泛型

泛型

  • 和C++中的模板差不多
  • 在给泛型指定具体类型后,可以传入该类型或者其子类类型
  • 自定义泛型不能够和static共同修饰成员 因为static修饰的是类变量,伴随着类的建立,而泛型类型是未确定类型,显然不能一起使用
  • 泛型没有继承性

Comparable和Comparator的比较

Comparator 对应 compare 一般用于业务排序,例如对多组数据进行排序时,限定排序规则
Comparable 对应 compareTo 一般用于类实体 进行规定类的排序规则

例子

//Comparator 对应  compare
ArrayList<Employee> employees = new ArrayList<>();
employees.sort(new Comparator<Employee>() {     //实现接口的匿名内部类
 @Override
 public int compare(Employee o1, Employee o2) {
     return o1.compareTo(o2);
 }
});
//Comparable 对应  compareTo		String 等常用类大都实现了compareTo方法
class MyDate implements Comparable<MyDate> {
 private int year;
 private int month;
 private int day;
 @Override
 public int compareTo(MyDate o) {        //自定义比较规则
     int i = year - o.year;
     if (i != 0) return i;
     int j = month - o.month;
     if (j != 0) return j;
     int k = day - o.day;
     return k;
 }
}

自定义泛型接口

  • 在接口中,静态成员也是不能使用泛型

  • 泛型接口的类型,是在继承接口或者实现接口时确定

  • 没用指定类型,默认为Object

    package Generic;
    public class Generic_03 {
    }
    interface A<T, R> {
        void solve1(T t);
        void solve2(R r);
        //T name;不能这样使用,因为在接口中的普通成员一般是静态的
        public static final int a = 2;
    }
    interface B extends A<Double, String> {     //如果这里没指定类型那也是Object
    }
    class C implements B {
        @Override
        public void solve1(Double aDouble) {
        }
        @Override
        public void solve2(String s) {
        }
    }
    class D implements A{       //也可以指定类型A<类型,类型>
        @Override
        public void solve1(Object o) {      //没有指定类型默认为Object
        }
        @Override
        public void solve2(Object o) {
        }
    }
    

泛型的继承和通配符说明

  • 只是针对于泛型类而言
  • <?> 支持任意类型
  • <? extends A> 支持A类及A类的子类,规定泛型的上限
  • <? super A> 支持A类及A类的父类,不限于直接父类,规定了泛型的下限
package Generic;
import java.util.ArrayList;
import java.util.List;
@SuppressWarnings({"all"})
public class Generic_02 {
    public static void main(String[] args) {
        List<Object> list1 = new ArrayList<>();
        List<String> list2 = new ArrayList<>();
        List<AA> list3 = new ArrayList<>();
        List<BB> list4 = new ArrayList<>();
        List<CC> list5 = new ArrayList<>();
        //<?>
        fun1(list1);
        fun1(list2);
        fun1(list3);
        fun1(list4);
        fun1(list5);
        //<? extends A>
        //fun2(list1);Object
        //fun2(list2);String
        fun2(list3);//A本类
        fun2(list4);//A子类
        fun2(list5);//A间接子类
        //<? super A>
        fun3(list1);//Object是任何类的父类
        //fun3(list2);String和本类没有继承关系
        fun3(list3);//A本类
        //fun3(list4);B类
        //fun3(list5);C类
    }
    public static void fun1(List<?> t) {
    }
    public static void fun2(List<? extends AA> t) {
    }
    public static void fun3(List<? super AA> t) {
    }
}
class AA {}
class BB extends AA {}
class CC extends BB {}
class DD<T, R> {
    public void fun(DD<?, ?> t) {
    }
}

小案例

package Generic;
import org.junit.jupiter.api.Test;
import java.util.*;
public class Generic_text {
    public static void main(String[] args) {
    }
    @Test
    public void test01() {
        DAO<User> dao = new DAO<>();
        dao.save("001", new User(1,9,"tom"));
        dao.save("002", new User(2,18,"syj"));
        dao.save("003", new User(3,22,"sxy"));
        dao.save("004", new User(4,2,"xhj"));
        List<User> list = dao.list();
        System.out.println(list);
    }
}

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 DAO<T> {
    private Map<String, T> map = new HashMap<>();
    public void save(String id, T entity) {
        map.put(id, entity);
    }
    public T get(String id) { return map.get(id); }
    public void update(String id, T entity) { map.put(id, entity); }
    public void delete(String id) { map.remove(id); }
    public List<T> list() {
        List<T> list = new ArrayList<>();
        Set<String> set = map.keySet();
        for (String s : set) {
            list.add(get(s));
        }
        return list;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值