一、自定义泛型类(接口)

文章目录

  • 一、自定义泛型类(接口)
    • 1、基础知识
    • 2、代码举例
  • 二、自定义泛型方法
    • 1、基础知识
    • 2、代码举例

ps:泛型类和泛型接口的区别就是类和接口的区别,这里不做阐述

1、基础知识

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

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

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

  4. 泛型不同的引用不能相互赋值。(见下面代码举例部分的第四点测试类的)

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

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

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

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

  9. 在类/接口上声明的泛型,在本类或本接口中即代表某种类型,可以作为非静态属性的类型、非静态方法的参数类型、非静态方法的返回值类型。但在静态方法中不能使用类的泛型。(看下面代码举例第一点自定义泛型类Order注释部分)(原因:泛型在创建对象的时候才指定,但是静态方法要早于创建对象,所以静态方法中不能使用类的泛型)

  10. 异常类不能是泛型的

    public class Test11<T> extends Exception{}//错误的
    
  11. 不能使用new E[]。但是可以:E[] elements = (E[])new Object[capacity];

    参考:ArrayList源码中声明:Object[] elementData,而非泛型参数类型数组。

    举例:

    T[] t = new T[];//错误的
    T[] t = (T[]) new Object[10];//而且后续用的时候赋值的时候new的只能是T或者T的子类的对象,不然会报错
    
  12. .父类有泛型,子类可以选择保留泛型也可以选择指定泛型类型:

    • 子类不保留父类的泛型:按需实现

      • 没有类型 擦除
      • 具体类型
    • 子类保留父类的泛型:泛型子类
      • 全部保留
      • 部分保留

代码举例:

class Father<T1, T2> {}
// 子类不保留父类的泛型
// 1)没有类型 擦除class Son1 extends Father {// 等价于class Son extends Father<Object,Object>{}
// 2)具体类型class Son2 extends Father<Integer, String> {}
// 子类保留父类的泛型
// 1)全部保留class Son3<T1, T2> extends Father<T1, T2> {}
// 2)部分保留class Son4<T2> extends Father<Integer, T2> {}

class Father<T1, T2> {}
// 子类不保留父类的泛型
// 1)没有类型 擦除class Son<A, B> extends Father{//等价于class Son extends Father<Object,Object>{}
// 2)具体类型class Son2<A, B> extends Father<Integer, String> {}
// 子类保留父类的泛型
// 1)全部保留class Son3<T1, T2, A, B> extends Father<T1, T2> {}
// 2)部分保留class Son4<T2, A, B> extends Father<Integer, T2> {}

2、代码举例

  1. 自定义泛型类Order

    package com.jsm.java1;
    //自定义泛型类
    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;}@Overridepublic String toString() {return "Order{" +"orderName='" + orderName + '\'' +", orderId=" + orderId +", orderT=" + orderT +'}';}//静态方法中不能使用类的泛型。/*public static void show(T orderT){System.out.println(T orderT);}*/}
    
  2. 继承泛型类Order并且指明了泛型为Integer(SubOrder不再是泛型类

    public class SubOrder extends Order<Integer> {}
    
  3. 继承泛型类Order但是仍然保留了”T”(SubOrder1仍然是泛型类

    public class SubOrder1<T> extends Order<T> {}
    
  4. 测试:OrderTest

    package com.jsm.java1;import org.junit.Test;public class OrderTest {@Testpublic void test1(){//如果定义了泛型类,实例化没有指明类的泛型,则认为此泛型类型为Object//要求:如果定义了类是带泛型的,建议在实例化时候要指明类的泛型Order<Object> order = new Order<>();order.setOrderT(123);order.setOrderT("ABC");//建议:实例化时候指明类的泛型Order<String> order1 = new Order<String>("orderAA",1001,"F");order1.setOrderT("AA:hello");SubOrder sub1 = new SubOrder();//由于子类在继承带父类的泛型时,指明了泛型类型,则实例化子类对象时,不再需要指明泛型sub1.setOrderT(1234);SubOrder1<Integer> sb1 = new SubOrder1<Integer>();sb1.setOrderT(1234);@Testpublic void test2(){//泛型不同的引用不能相互赋值ArrayList<String> list1= new ArrayList<String>();ArrayList<Integer> list2= new ArrayList<Integer>();//list1=list2;//尽管在编译时ArrayList<String>和ArrayList<Integer>是两种类型,但是,在运行时只有//一个ArrayList被加载到JVM中。}}
    }
    

二、自定义泛型方法

1、基础知识

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

  2. 举例代码中方法这里的E是调用方法的时候确定的,并非实例化类的时候确定,所以和类的泛型没关系,所以泛型方法可以是静态的

  3. 泛型方法的格式:

    [访问权限] <泛型> 返回类型 方法名([泛型标识 参数名称]) 抛出的异常

2、代码举例

//学习内容:
//开发时间:10月16日  0:13
package com.jsm.java2;import org.junit.Test;import java.util.ArrayList;
import java.util.List;public class MethodTest {//测试泛型方法@Testpublic void test11(){Integer[] arr=new Integer[]{1,2,3,4};//泛型方法在调用时,指明泛型参数的类型,这个类型和类的泛型没有任何关系List<Integer> list = copyFromArrayToList(arr);System.out.println(list);//[1, 2, 3, 4]}//泛型方法public  <E> List<E> copyFromArrayToList(E[] arr){ArrayList<E> list=new ArrayList<>();for (E e:arr){list.add(e);}return list;}//说明:这个方法这里的E是调用方法的时候确定的,并非实例化类的时候确定,所以和类的泛型没关系,所以泛型方法可以是静态的
}

Java泛型02:自定义泛型类、泛型方法相关推荐

  1. java:泛型(自定义泛型类、自定义泛型接口、泛型的继承和通配符说明)

    目录 一.泛型的介绍 二.泛型的语法 2.1 泛型的声明 2.2 泛型的实例化 2.3 泛型使用举例 2.3 泛型使用的注意事项和细节 2.4 泛型课堂练习题 2.5 自定义泛型类 2.6 自定义泛型 ...

  2. Java自定义泛型类注意点

    目录 自定义泛型类 如果定义了泛型类,实例化没有指明类的泛型,则认为此泛型类型为Object类型 由于子类在继承带泛型的父类时,指明了泛型类型.则实例化子类对象时,不需要指明类型 由于子类在继承带泛型 ...

  3. java 继承泛型类_JAVA高级复习-自定义泛型类及泛型类的继承

    一.自定义泛型类 自定义泛型结构:泛型类.泛型接口.泛型方法 自定义泛型类的内部结构(方法.属性.构造器等),可以使用类的泛型 如果定义了泛型类,实例化时没有指明类的泛型,则认为泛型类型为Object ...

  4. java泛型程序设计——泛型类的静态上下文中类型变量无效+不能抛出或捕获泛型类的实例

    [0]README 0.1) 本文描述+源代码均 转自 core java volume 1, 旨在理解 java泛型程序设计 的 泛型类的静态上下文中类型变量无效+不能抛出或捕获泛型类的实例 的知识 ...

  5. Java泛型进阶篇: 无界通配符、上界通配符以及下界通配符

    专栏文章导航 Java泛型入门篇: 泛型类.泛型接口以及泛型方法 Java泛型进阶篇: 无界通配符.上界通配符以及下界通配符 Java泛型原理篇: 类型擦除以及桥接方法 文章目录 前言 1. 无界通配 ...

  6. Java泛型详解:<T>和Class<T>的使用。泛型类,泛型方法的详细使用实例

    Java泛型 Class和 Class<?>类型 有什么区别 一.引入 1.泛型是什么 首先告诉大家ArrayList就是泛型.那ArrayList能完成哪些想不到的功能呢?先看看下面这段 ...

  7. 【Java 泛型】泛型用法 ( 泛型类用法 | 泛型方法用法 | 泛型通配符 ? | 泛型安全检查 )

    文章目录 一.泛型类用法 二.泛型方法用法 三.泛型通配符 <?> 四.泛型安全检查 五.完整代码示例 1.泛型类 / 方法 2.main 函数 一.泛型类用法 泛型类用法 : 使用时先声 ...

  8. 【Java 泛型】泛型简介 ( 泛型类 | 泛型方法 | 静态方法的泛型 | 泛型类与泛型方法完整示例 )

    文章目录 一.泛型简介 二.泛型类 三.泛型方法 四.静态方法的泛型 五.泛型类与泛型方法完整示例 一.泛型简介 泛型 可以 简单理解为 参数化类型 , 主要作用在 类 , 方法 , 接口 上 ; j ...

  9. java泛型程序设计——定义简单泛型类+泛型方法

    [0]README 0.1) 本文描述+源代码均 转自 core java volume 1, 旨在理解 java泛型程序设计 的 定义泛型类+泛型方法的知识: [1]一个泛型类: 就是具有一个或多个 ...

最新文章

  1. [转载]MIT牛人解说数学体系
  2. 做移动互联网App,你的测试用例足够吗?
  3. eclipse下创建Maven项目
  4. 交换排序(冒泡、快速)
  5. 计算机组成原理二进制地址码,计算机组成原理第四章第三讲.ppt
  6. 在职场想要涨薪升职,需要打造个人品牌
  7. NOR Flash的原理与操作
  8. 2021-08-21 mvc架构
  9. 用php搭建自己的私人云盘(KODBOX可道云)
  10. 谐振放大器工作点和阻抗
  11. java日期计算天数_用Java计算两个日期之间的天数
  12. iphone主屏幕动态壁纸_iPhone不需长按自动触发动态壁纸教程
  13. 作业1:关于使用python中scikit-learn(sklearn)模块,实现鸢尾花(iris)相关数据操作(数据加载、标准化处理、构建聚类模型并训练、可视化、评价模型)
  14. (ROS)Moveit编程示例
  15. “个人设置”设计思路
  16. 高级数据操作--连接查询
  17. java 块注释_java的注释
  18. 2023北华大学计算机考研信息汇总
  19. java里面几种锁的区别。。
  20. 节日献礼:Flutter图片库重磅开源!

热门文章

  1. 一些有关UED的团队和个人博客
  2. BugPhobia终章篇章:学霸在线系统Beta阶段展示
  3. 用自动化工具进行网络巡检------AINA Lyzer
  4. tensorflow use_bias参数
  5. 基于FPGA的数码管动态扫描显示(含代码)
  6. 小型无人机的布线与布局设计
  7. 【流量代理】代理模式
  8. Mysql连接工具navicat的连接方法
  9. 男方患白血病女方引产胎儿 律师:没领证不违法
  10. 腾讯3.1级别的高级开发工程师是怎么炼成的?