Java学习(13)—— 泛型

一.   泛型

      1. 集合中使用泛型

        (1)集合接口或集合类都是带有泛型的结构;

        (2)在实例化集合类时,可以指明具体的泛型类型;

        (3)泛型的类型必须是类,不能是基本数据类型,如果要用到基本数据类型,使用包装类替换;

        (4)实例化时如果没有指明泛型的类型,则默认为java.lang.Object类型

import java.util.*;

public class Test{
    public static void main(String[] args) {
        //在集合中使用泛型
        ArrayList<Integer> list = new ArrayList<Integer>();   //增加泛型,使得集合中的数据都是整型
        list.add(13);
        list.add(12);
        list.add(25);
        list.add(10);
        //list.add("A");   编译时就会检查参数类型,如果不是整型,则会报错

        for(Integer integer:list){
            int i = integer;
            System.out.println(i);
        }
    }
}
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;

public class Test{
    public static void main(String[] args) {
        //在HashMap中使用泛型
        HashMap<String,Integer> map = new HashMap<String,Integer>();
        map.put("Tom",22);
        map.put("Bob",23);
        map.put("Joe",25);
        //map.put(12,"A");   会报错

        Set<Map.Entry<String,Integer>> set = map.entrySet();
        Iterator<Map.Entry<String,Integer>> iterator = set.iterator();
        while(iterator.hasNext()){
            Map.Entry<String,Integer> entry = iterator.next();
            String key = entry.getKey();
            int value = entry.getValue();
            System.out.println(key + "=" + value);
        }
    }
}

        2.自定义泛型类或接口

public class Test{
    public static void main(String[] args) {
        //如果定义了泛型类,实例化时没有指定类的泛型,则认为该泛型是Object类型
        Person person1 = new Person();
        person1.setSex(12);
        person1.setSex("男");

        //如果定义的类是带泛型的,建议在实例化时要指明类的泛型
        Person<String> person =  new Person<String>("Tom",23,"man");
        person.setSex("男生");   //只能使用泛型指定的数据类型

        //由于子类在继承带泛型的父类时,指明了泛型的类型,则实例化子类对象时,不需要再指明泛型类型
        Man man = new Man();
        man.setSex('男');    //由于子类指明了泛型的类型为Character,因此只能使用char型

        //子类在继承带泛型的父类时,没有指明泛型的类型,则实例化子类对象时,需要指明泛型类型
        Woman<String> woman = new Woman<String>();
        woman.setSex("女生");     //使用上面指定的泛型类型
    }
}

class Person<T>{      //自定义泛型类
    String name;
    int age;
    T sex;     //在不确定变量的类型时,可以使用泛型;在实例化时需要给变量指定数据类型

    public Person(){

    }

    public Person(String name,int age,T sex){
        this.name = name;
        this.age= age;
        this.sex = sex;
    }

    public T getSex(){
        return sex;
    }

    public void setSex(T sex){
        this.sex = sex;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", sex=" + sex +
                '}';
    }
}

class Man extends Person<Character>{   //Man不是泛型类

}

class Woman<T> extends Person<T>{     //Woman是泛型类

}

        3.自定义泛型方法

import java.util.ArrayList;
import java.util.List;

public class Test{
    public static void main(String[] args) {
        Person<String> person = new Person<>();

        Integer[] array = new Integer[]{12,13,10,25};
        List<Integer> list =  person.gradeList(array);
        System.out.println(list);    //[12, 13, 10, 25]
    }
}

class Person<T>{
    String name;
    int age;
    T sex;

    public Person(){

    }

    public Person(String name,int age,T sex){
        this.name = name;
        this.age= age;
        this.sex = sex;
    }

    //自定义泛型方法
    public <E> List<E> gradeList(E[] array){     //泛型方法中的泛型参数与类的泛型参数无关,泛型方法与该类是不是泛型类无关
        ArrayList<E> list = new ArrayList<>();
        for(E e:array){
            list.add(e);
        }
        return list;
    }
}

        4.通配符:?

       (1)类A是类B的父类,但是G<A>和G<B>不具备子父类关系,是并列的;

       (2)类A是类B的父类,则A<G>还是B<G>的父类;

import java.util.ArrayList;
import java.util.List;

public class Test{
    public static void main(String[] args) {
        Object obj = "A";
        String str = "AA";
        obj = str;

        Object[] arr1 = new Object[3];
        String[] arr2 = new String[3];
        arr1 = arr2;

        List<Object> list1 = new ArrayList<>();
        List<String> list2 = new ArrayList<>();
        //list1 = list2;    编译错误,list1和list2是并列关系,不具备子父类关系

        List<String> list3 = new ArrayList<>();
        ArrayList<String> list4 = new ArrayList<>();
        list3 = list4;
    }
}

         (3)类A是类B的父类,但是G<A>和G<B>不具备子父类关系,他们共同的父类是G<?>

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class Test{
    public static void main(String[] args) {
        List<Object> list1 = new ArrayList<>();
        List<String> list2 = new ArrayList<>();

        List<?> list = new ArrayList<>();     //list是list1和list2的父类
        list = list1;
        list = list2;

        Test test = new Test();
        test.print(list1);
        test.print(list2);

    }

    public void print(List<?> list){
        Iterator<?> iterator = list.iterator();
        while(iterator.hasNext()){
            Object obj = iterator.next();
            System.out.println(obj);
        }
    }
}
import java.util.ArrayList;
import java.util.List;

public class Test{
    public static void main(String[] args) {
        List<String> list1 = new ArrayList<>();
        list1.add("A");
        list1.add("B");
        list1.add("C");

        List<?> list = new ArrayList<>();
        list =list1;

        //list.add("D");    不能向List<?>中添加数据

        Object obj = list.get(0);    //可以读List<?>中的数据
        System.out.println(obj);     //A
    }
}

        (4)有限制条件的通配符

                ?extends A:G<? extends A>可以作为G<A>和G<B>的父类,其中B是A的子类

                ?super A:G<? super A>可以作为G<A>和G<B>的父类,其中B是A的父类

import java.util.ArrayList;
import java.util.List;

public class Test{
    public static void main(String[] args) {
        List<? extends Person> list1 = new ArrayList<>();    // ?小于等于Person
        List<? super Person> list2 = new ArrayList<>();      // ?大于等于Person

        List<Man> list3 = new ArrayList<>();
        List<Person> list4 = new ArrayList<>();
        List<Object> list5 = new ArrayList<>();

        list1 = list3;
        list1 = list4;
        //list1 = list5;  编译错误

        //list2 = list3;  编译错误
        list2 = list4;
        list2 = list5;


        //读取数据
        list1 = list4;
        Object o = list1.get(0);
        Person p1 = list1.get(0);
        //Man m = list1.get(0);   编译错误

        list2 = list4;
        Object o1 = list2.get(0);
        //Person p2 = list2.get(0);     编译错误
    }
}

class Person{

}

class Man extends Person{

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值