栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Java 进阶——泛型

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Java 进阶——泛型

文章目录
  • Java 进阶——泛型
    • 1、简介
    • 2、泛型使用实例
    • 3、自定义泛型结构
      • 3.1、自定义泛型类和泛型接口
      • 3.2、自定义泛型方法
    • 4、通配符的使用

Java 进阶——泛型 1、简介

泛型的设计背景

集合容器类在设计阶段/声明阶段不能确定这个容器到底实际存的是什么类型的对象,所以在JDK1.5之前只能把元素类型设计为Object,JDK1.5之后使用泛型来解决。因为这个时候除了元素的类型不确定,其他的部分是确定的,例如关于这个元素如何保存,如何管理等是确定的,因此此时把元素的类型设计成一个参数,这个类型参数叫做泛型。Collection,List,ArrayList这个就是类型参数,即泛型。

泛型的概念

所谓泛型,就是允许在定义类、接口时通过一个标识表示类中某个属性的类型或者是某个方法的返回值及参数类型。这个类型参数将在使用时(例如,继承或实现这个接口,用这个类型声明变员、创建对象时)确定(即传入实际的类型参数,也称为类型实参)。

从JDK1.5以后,Java引入了“参数化类型( Parameterized type)”的概念,允许我们在创建集合时再指定集合元素的类型,正如: List,这表明该List只能保存字符串类型的对象。

JDK1.5改写了集合框架中的全部接口和类,为这些接口、类增加了泛型支持,从而可以在声明集合变量、创建集合对象时传入类型实参。

java 中泛型标记符:

  • E - Element (在集合中使用,因为集合中存放的是元素)
  • T - Type(Java 类)
  • K - Key(键)
  • V - Value(值)
  • N - Number(数值类型)
  • ? - 表示不确定的 java 类型
2、泛型使用实例

集合中使用泛型的情况

package fanxing;

import org.junit.Test;

import java.util.*;

public class Demo01 {
    //以ArrayList为例
    @Test
    public void test() {
        //泛型的类型不能是基本数据类型
        ArrayList list = new ArrayList<>();
        list.add(12);
        list.add(22);
        list.add(32);
        list.add(42);

//        list.add("wanli");编译不通过,会进行类型检查,保证数据的安全
        //forEach遍历
        for (Integer score : list) {
            int stuScore = score;
            System.out.println(stuScore);
        }
        //迭代器遍历
        Iterator iterator = list.iterator();
        while (iterator.hasNext()) {
            int stuScore1 = iterator.next();
            System.out.println(stuScore1);
        }
    }

    //以HashMap为例
    @Test
    public void test1(){
        HashMap map = new HashMap<>();
        map.put(1,"wanli");
        map.put(2,"shenming");
        map.put(3,"taoxian");
        map.put(4,"xuanyu");

        //遍历所有的key
        Set keySet = map.keySet();
        Iterator iterator = keySet.iterator();
        while (iterator.hasNext()){
            System.out.println(iterator.next());
        }

        //遍历所有的value
        Collection values = map.values();
        Iterator iterator1 = values.iterator();
        while (iterator1.hasNext()){
            System.out.println(iterator1.next());
        }

        //遍历所有的key-value
        Set> entrySet = map.entrySet();
        Iterator> iterator2 = entrySet.iterator();
        while (iterator2.hasNext()){
            System.out.println(iterator2.next());
        }
    }

}
3、自定义泛型结构 3.1、自定义泛型类和泛型接口

泛型类的声明和非泛型类的声明类似,除了在类名后面添加了类型参数声明部分。

自定义泛型类和自定义泛型接口的区别主要在与类和接口的区别。

自定义泛型类

public class Order {
    private int id;
    private String name;

    //类的内部结构可以使用类的泛型
    T orderT;

    public Order(){

    }

    public Order(int id,String name,T orderT){
        this.id = id;
        this.name = name;
        this.orderT = orderT;
    }

    public T getOrderT(){
        return orderT;
    }
    public void setOrderT(T orderT){
        this.orderT = orderT;
    }
    
}

自定义泛型类的使用

//如果自定义了泛型类,在实例化时要指明类的泛型,如果不指明就默认泛型类型是Object
Order order = new Order<>(1,"wanli","开朗");
order.setOrderT("害羞");
System.out.println(order.getOrderT());//害羞

自定义或使用泛型类泛型接口注意点

1、泛型类可能有多个参数,此时应将多个参数一起放在尖括号内。比如:

2、泛型类的构造器如下: public GenericClass()。而这种是错误的: public GenericClass(){}。

3、实例化后,操作原来泛型位置的结构必须与指定的泛型类型一致。

4、泛型不同的引用不能相互赋值。

5、泛型如果不指定,将被擦除,泛型对应的类型均按照Object处理,但不等价于Object。泛型要使用一路都用。要不用,一路都不要用。

6、如果泛型类是一个接口或抽象类,则不可创建泛型类的对象。

7、jdk1.7,泛型的简化操作: ArrayList flist = new ArrayList<>();

8、泛型的指定中不能使用基本数据类型,可以使用包装类替换。

9.在类/接口上声明的泛型,在本类或本接口中即代表某种类型,可以作为非静态属性的类型、非静态方法的参数类型、非静态方法的返回值类型。但在静态方法中不能使用类的泛型。

10.异常类不能是泛型的

11.不能使用new E[]。但是可以:E]elements =(E[])new Object[capacity];

12、父类有泛型,子类可以选择保留泛型也可以选择指定泛型类型: