IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> 2021-10-20 Java学习(泛型) -> 正文阅读

[Java知识库]2021-10-20 Java学习(泛型)

一、定义泛型类

public class Order<T> {

    String orderName;
    int orderId;
    //类的内部结构就可以使用泛型

    T orderT;

    public Order(){}

    public Order(String orderName,int orderId,T orderT)
    {
        this.orderName=orderName;
        this.orderId=orderId;
        this.orderT=orderT;
    }
	
	//如下的泛型方法都不是泛型方法
    public T getOrderT()
    {
        return orderT;
    }
    public void setOrderT(T orderT)
    {
        this.orderT=orderT;
    }

}

 public void test()
    {
        //如果定义了泛型类,实例化没有指明类的泛型,则认为此泛型类型为Object
        Order order=new Order();
        order.setOrderT("ABC");
        order.setOrderT(123);
        //建议:实例化时指明类的泛型
        Order<String> order1=new Order<String>();
    }

二、子类继承

情况1:

//定义子类 此处已经指明了父类的泛型类型
public class SubOrder extends Order<Integer>{

}

    @Test
    public void test2()
    {
        SubOrder subOrder=new SubOrder();

        subOrder.setOrderT(11);
        //子类在继承带泛型的父类时候,指明了父类类型,则实例化子类对象时,不需要再指明泛型。

    }

情况2:子类仍是泛型类

public class SubOrder<T> extends Order<T>{

}

//生成对象时还是要指明泛型
        SubOrder<String> sub2=new SubOrder<>();
        sub2.setOrderT("order2");

三、细节补充

  1. 泛型类可能有多个参数,此时应将多个参数一起放在尖括号内,比如<E1,E2,E3>
  2. 泛型类的构造器 public GenericClass(){} 也就是说声明构造器的时候不用加泛型的尖括号
  3. 实例化后,操作原来泛型位置的结构必须与指定的泛型类型一致
  4. 泛型不同的引用不能相互赋值
    尽管在编译时ArrayList<String>ArrayList<Integer>是两种类型,但是,在运行时只有一个ArrayList被加载到JVM中
  5. 泛型如果不指定,将被擦除,泛型对应的类型均按照object处理,但不等价与Object。经验:泛型要使用就一路使用;不使用就一路不使用
  6. 泛型的指定中不能使用基本数据类型,可以使用包装类替换。
  7. 静态方法不能用泛型–生成对象的时候才指定类型呢
  8. 异常类不能是泛型的
  9. 不能使用new E[],但是可以E[] elements=(E[])new Object[capacity];

四、泛型方法

在方法中出现了泛型的结构,泛型参数与类的泛型参数没有任何关系
换句话说,泛型方法所属的类是不是泛型类没有关系

如果这样写:
public List<E> copyFromArrayToList(E[] arr)
会认为E是某个类的名字

如果想要把E看作是泛型参数(可以任意指定的数据类型的话),
这样写:
public <E> List<E> copyFromArrayToList(E[] arr)

    //泛型方法
    public <E> List<E> copyFromArrayToList(E[] arr)
    {
        ArrayList<E> list=new ArrayList<>();
        for(E e:arr)
        {
            list.add(e);
        }
        return list;
    }

测试:当arr类型确定的时候,就由此确定返回值的类型。这个E是在调用的时候确定的,而不是实例化的时候确定的,也就可以指定为静态方法了

    @Test
    public void Test3()
    {
        Order<String> order=new Order<>();
        Integer[] arr=new Integer[]{1,2,3,4};
        //泛型方法在调用时,指明泛型参数的类型
        List<Integer> list=order.copyFromArrayToList(arr);
        System.out.println(list);
    }

五、使用通配符

通配符:?

类A是类B的父类,G<A>G<B>是没有关系的,二者的共同父类是G<?>

List<String> list1=new ArrayList<>();
list1.add("123");
list1.add("456");
List<?> list=list1;
//对于list,现在只能读不能写(唯一的例外是null)

Object o=list.get(0);
System.out.println(o);

  • 通配符指定上限:extends
    <? extends Number>只允许泛型为Number及Number子类的引用调用

  • 通配符指定下限:super
    <? super Number>只允许泛型为Number及Number父类的引用调用

List<? extends Person> list1=null;
List<? super Person> list2=null;

List<Student> list3=null;

list1=list3;//可以 因为List<Student> 是List<? extends Person>子类
  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2021-10-21 12:03:18  更:2021-10-21 12:04:30 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 22:14:34-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码