泛型

2019-04-07  本文已影响0人  Finlay_Li

泛型Generic(JDK1.5新加入):

1、在 Java 中以 "<>" 的形式呈现,"<>" 中写引用数据类型

2、泛型中的类型可用任意字母代表
通常我们使用 T : Type E : Element K : Key V : Value R : Return

为什么使用泛型:

1、我们在操作数据时,有时不知道要操作的数据是什么类型。
提高代码复用性
2、集合中不使用泛型,意味着集合中可以存储任意类型的对象
若需要具体到某一个数据类型时,需要强制类型转换,可能引发 ClassCastException
解决元素存储的安全性, 解决获取元素时,需要类型强转的问题(繁琐)

泛型本质

只作编译时限制,当执行时不作读取。
证:通过查看.class文件,<>是不存在的

泛型相关使用

集合中

1、List
List<String> list=new ArrayList<>();
①add() 只能添加String
②泛型提供编译检查


2、迭代器使用泛型
Iterator<Integer> it=set.iterator();
当遍历时,迭代器使用泛型或者Map遍历使用泛型,等于取出的类型也限制


3、Map
Set<Entry<Person,Integer>> set=map.entrySet();
Iterator<Entry<Person,Integer>> it=set.iterator();
while(it.hasNext()){
Entry<Person,Integer> ety=it.next();
Person p=ety.getKey();
Integer ity=ety.getValue();
System.out.println(p+"=="+ity);
}

DAO层

1、场景
数据库表,属性<——>类,属性
成千上万张表——>成千上万个类处理
处理方法——>成千上万的方法

2、我们想要的方法是:当千万张表使用同一个功能方法时,我们只写一个这样的方法即可

3、这时,设计带泛型的DAO类,适用于任意不同类型的类


    public class DAO<T> {//Database Access Object
        
        private List<T> list = new ArrayList<>();
        
        public void add(T t){
            list.add(t);
        }
        
        public T get(int id){
            return list.get(id);
        }
        
        public void update(int id, T t){
            list.set(id, t);
        }
    }
    //对任意不同类型的类进行操作
    public void test5(){
        DAO<Person> dao = new DAO<>();
        dao.add(new Person("张三", 18));
        Person p = dao.get(0);
        System.out.println(p);
        
        DAO<Order> orderDAO = new DAO<>();
        orderDAO.add(new Order());
        Order o = orderDAO.get(0);
        System.out.println(o);
    }

自定义泛型类、接口

1、何时定义:
当我们在写时不确定以后要用的是什么类型,但知道肯定要有这个元素

2、何时确定? 使用时确定

3、示例

    public class MyGeneric <T>{
    private T tt;//未知类型
    
    public void add(T tt){ //不确定类型
        
    }
    
    public T get(){ //不确定类型
        return null;
    }
     @Test
    public void test4(){
        //使用时,类型随着类类型的确定而确定,有了编译检查,其他类型不可传递
        MyGeneric<String> mg = new MyGeneric<>();
        mg.add("BBB"); 
        String str=mg.get();
        
        MyGeneric<Person> mg1 = new MyGeneric<>();//使用该类
        mg1.add(new Person());
        Person p=mg1.get();
    }

自定义泛型方法

1、何时定义:
当写方法时,返回值不确定
同时,返回值的类型与类的<T>又不一样

2、如何定义:在方法中声明<>

3、方法在什么时候可以确定类型?(参数列表)
调用方法,传入一个实参时,返回值的类型以实参的类型为准

4、示例

    public <E> E sort(List<E> list){
            //sort(new ArrayList<String>());
        return list.get(0);
    }

通配符 ( ? )

1、为何使用?
虽然 Man 是 Person 的子类,但是泛型限制后 List<Man> 就不能给List<Person> 。
意味着不能使用多态

2、统配符的三种使用
List<?> :
1 可以接收任意泛型类型的集合
2 但是在集合的使用中,遍历时又的按Object取!要强转!又倒回去了!

List<? extends Person> :
1 只可以接收 Person 本类类型的泛型集合及 Person 子类类型的泛型集合,再次限制类型为Person
2 我们又可以使用多态了
3 若要调用子类特有方法,当然还得 instanceof

List<? super Person> :
1 只可以接收 Person 本类类型的泛型集合集 Person 父类类型的泛型集合
2 向上限制,没啥用

上一篇 下一篇

猜你喜欢

热点阅读