泛型的继承、通配和练习

本次博客带领大家了解泛型的继承和通配符,还有泛型最后的练习。

泛型的继承和通配符说明

  1. 泛型不具备继承性。
List<Object> list = new ArrayList<String>();//错误的
  1. <?>:支持任意泛型类型。
  2. <? extends A>:支持A类以及A类的子类,规定了泛型的上限。
  3. <? super A>:支持A类以及A类的父类,不限于直接父类,规定了泛型的下限。
public class GenericExtends {
    public static void main(String[] args) {
        Object o = new String("xxx");

        //泛型没有继承性
        //List<Object> list = new ArrayList<String>();

        //举例说明下面三个方法的使用
        List<Object> list = new ArrayList<>();
        List<String> list1 = new ArrayList<>();
        List<AAA> list2 = new ArrayList<>();
        List<BBB> list3 = new ArrayList<>();
        List<CCC> list4 = new ArrayList<>();

        //如果是List<?> c,可以接收任意的泛型类型
        printCollection1(list);
        printCollection1(list1);
        printCollection1(list2);
        printCollection1(list3);
        printCollection1(list4);

        //? extends AAA 表示上限,可以接收 AAA或者AAA子类
        //printCollection2(list);//×
        //printCollection2(list1);//×
        printCollection2(list2);
        printCollection2(list3);
        printCollection2(list4);

        //? super AAA:支持AAA类以及AAA类的父类,不限于直接父类,规定了下限
        printCollection3(list);
        //printCollection3(list1);//×
        printCollection3(list2);
        //printCollection3(list3);//×
        //printCollection3(list4);//×

    }
    //说明:List<?> 表示任意的泛型类型都可以接收
    public static void printCollection1(List<?> c){
        for (Object object :c) {
            System.out.println(object);
        }
    }
    //? extends AAA 表示上限,可以接收 AAA或者AAA子类
    public static void printCollection2(List<? extends AAA> c){
        for (Object object :c) {
            System.out.println(object);
        }
    }
    //? super AAA:支持AAA类以及AAA类的父类,不限于直接父类
    //规定了泛型的下限
    public static void printCollection3(List<? super AAA> c){
        for (Object object :c) {
            System.out.println(object);
        }
    }
}
class AAA{
}
class BBB extends AAA{}

class CCC extends BBB{}

练习:

定义个泛型类DAO,其中定义一个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,Tentity):替换map中key为id的内容,改为entity对象。
  4. public List list():返回map中存放的所有T对象。
  5. public void delete(String id):删除指定id对象。

定义一个User类:

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

创建DAO类的对象,分别调用其save、get、update、list、delete方法来操作User对象,使用Junit单元测试类进行测试。

public class Homework01 {
    @Test
    public void testList(){

        Dao<User> dao = new Dao<>();
        dao.save("001",new User(1,18,"jack"));
        dao.save("002",new User(2,19,"tom"));
        dao.save("003",new User(3,20,"smith"));

        List<User> list =dao.list();
        System.out.println("list="+list);

        dao.update("003",new User(3,28,"linan"));
        dao.delete("001");
        System.out.println("====修改后=====");
        list =dao.list();
        System.out.println("list="+list);
        System.out.println("id=003"+dao.get("003"));
    }
}

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);
    }
    //遍历map [k-v],将map的 所有value(entity),封装到ArrayList返回即可

    public List<T> list(){
        //创建一个ArrayList
        ArrayList<T> list = new ArrayList<>();
        //遍历map
        Set<String> keySet = map.keySet();
        for (String key :keySet) {
            list.add(get(key));
        }

        return list;
    }

    public void delete(String id){
        map.remove(id);
    }
}

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 "User{" +
                "id=" + id +
                ", age=" + age +
                ", name='" + name + '\'' +
                '}';
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值