文章目录

  • 1. 概念
  • 2. 为什么要使用泛型(Generic)
    • 2.1 在ArrayList中使用泛型
    • 2.2 在HashMap中使用泛型
  • 3. 自定义泛型结构
    • 3.1 泛型类与泛型接口
    • 3.2 泛型类的子类
    • 3.3 自定义泛型类/接口 仍需注意的点
    • 3.5 泛型方法

1. 概念


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

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

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

2. 为什么要使用泛型(Generic)


拿集合来举例

  • 集合在jdk 5 时,全部改为带泛型的结构

  • 在实例化集合类时,可以指明具体的泛型类型

  • 指明后,在集合或类或接口中,凡是定义类或接口,内部结构(可以是 方法,构造器,属性等)使用到类的泛型的位置,都指定为实例化的泛型类型。

    例如:在下面的代码中,ArryList指定为Integer,add(E e) 就变成了 add(Iteger e)

  • 泛型的类型必须是一个类,不能是基本数据类型。如果想用到基本类型,那就要用它们的包装类

  • 如果在实例化时,没有指明泛型的类型,则默认使用java.lang.Object类型。

2.1 在ArrayList中使用泛型


  1. 没有泛型的话,集合里面存储数据的类型就是Object,所以说,在某些情况下会出现我们不希望的类型进入这个集合,所以有类型安全的问题。

  2. 因为集合里都是当作Object类型,所以在我从集合中取数据的时候,要通过强制转换,将Object类型,强制转换成我们存入之前对象的类型。一旦有其他类型的对象混入,这里就会出现 ClassCastException。

ArrayList list = new ArrayList();list.add(90);list.add(92);list.add(95);list.add(91);// 类型不安全:// 因为add的参数是Object类型,所以字符串也能被添加成功,所以就存在危险。list.add("asdasd");for (Object score : list){// 强转时,可能会出现ClassCastException异常int stuscore = (int) score;System.out.println(stuscore);}

当我们使用了泛型之后,在编译时就会进行类型检查,如果混入其他类型,在编译的时候就会抛出异常

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Fj1rwlGw-1603244628739)(/Users/luca/MarkText-img-Support/2020-07-01-19-47-14-image.png)]

2.2 在HashMap中使用泛型

//java7 之前应该这样写,之后就可以省略了
//HashMap<String, Integer> map = new HashMap<String, Integer>();
HashMap<String, Integer> map = new HashMap<>();map.put("luca",123);map.put("lucy",122);map.put("lu",125);map.put("lucas",121);Set<Map.Entry<String, Integer>> entry = map.entrySet();Iterator<Map.Entry<String, Integer>> ite = entry.iterator();while(ite.hasNext()){Map.Entry<String, Integer> e = ite.next();String name = e.getKey();int score = e.getValue();System.out.println(name + score);}

3. 自定义泛型结构


3.1 泛型类与泛型接口

  1. 类上面加一个<> 就是泛型类,也就是说使用了泛型的类就叫做泛型类,泛型类与泛型接口没什么太大的却别,区别就是类与接口的区别,所以拿泛型类为例。

  2. 如果有一个类,这个类有一个属性,但是这个属性的类型不确定,这个属性的类型要在实例化的时候才能确定。这时我们就可以在这个类中使用泛型,我们之需要在声明类的时候加上一个<>,里面的字母一般为大写一般没 T,O,E,K,V 等

// 这样我们就可以在Order类中使用泛型了,这个T就称为类的泛型
public class Order<T> {String ordername;int orderid;//使用T——类的泛型T ordert;// 有类的泛型的构造器public Order(String ordername,int orderid,T ordert){this.orderid = orderid;this.ordername = ordername;this.ordert = ordert;}// 类的泛型的get set 方法。 其实和平时没有多大区别public T getOrdert() {return ordert;}public void setOrdert(T ordert) {this.ordert = ordert;}@Overridepublic String toString() {return "Order{" +"ordername='" + ordername + '\'' +", orderid=" + orderid +", ordert=" + ordert +'}';}
}

以上就是一个泛型类

3.2 泛型类的子类


当一个子类继承了一个泛型类时,在继承的时候就有两种情况:

  1. 子类在继承泛型类时就指明这个泛型
// 在继承Order时,就直接指明这个泛型,这时这个子类就时一个普通类了
public class subOrder extends Order<Integer> {}
  1. 继承时不指明 类似于ArrayList

    public class ArrayList<E> extends AbstractList<E>implements List<E>, RandomAccess, Cloneable, java.io.Serializable// 此时 subOrder仍是一个泛型类
    public class subOrder extends Order<T> {}
    

3.3 自定义泛型类/接口 仍需注意的点


// 4. 泛型不同的引用不能相互赋值
// 下面list1和list2 虽然都是 ArrayList类型,但是由于它们的泛型不同,所以不能相互赋值
ArrayList<String> list1 = new ArrayList<>();
ArrayList<Integer> list2 = new ArrayList<>();
list1 = list2; // 这是错误的

3.5 泛型方法


// 取自Collection源码
public interface Collection<E> extends Iterable<E>{<T> T[] toArray(T[] a);    // 这个是泛型方法boolean add(E e);           // 这个不是}

泛型方法只是针对于方法,与这个方法的类/接口是不是泛型的无关。

例子:假设想写一个复制数组的方法,将一个数组作为参数,在放到一个新的数组中,并将其返回。 这时我们不知道这个参数数组里面是什么类型的,而且不管是什么类型的的元素我们都应该能复制,所以这时这个方法就要使用泛型

// 这样写是不对的,因为编译器把这句话理解称:返回E类型的数组,输入E类型的数组;
// 它以为E就是一个类,所以为了告诉编译器这个是泛型,我们要在前面加一个<E>
public List<E> copyList(E[] inputlist){//返回E类型的数组   // 输入E类型的数组
}  public <E> List<E> copyList(E[] inputlist){}    // copyList的使用
Integer[] arry = {1,2,3,4};
List<Integer> list = order.copyList(arr);

泛型方法可以声明为静态的,因为泛型参数是在方法调用时确定的,并不是在实例化时确定的。

Java泛型-泛型作用+泛型在各种数据结构中的使用+自定义泛型相关推荐

  1. java泛型的作用及其基本概念

    一.泛型的基本概念 java与c#一样,都存在泛型的概念,及类型的参数化.java中的泛型是在jdk5.0后出现的,但是java中的泛型与C#中的泛型是有本质区别的,首先从集合类型上来说,java 中 ...

  2. java泛型类的作用_【Java-泛型系列一-泛型的作用】

    1 泛型是什么 泛型是一种在编译期间进行集合中的元素进行限定的机制.使用了泛型,在运行期见可以安全的将元素强转成指定的元素.下面举个例子看一下有和没有泛型的区别 1.1 假如没有泛型 List arr ...

  3. java泛型的作用_Java 泛型的作用及其基本概念

    一.泛型的基本概念 java与c#一样,都存在泛型的概念,及类型的参数化.java中的泛型是在jdk5.0后出现的,但是java中的泛型与C#中的泛型是有本质区别的,首先从集合类型上来说,java 中 ...

  4. java 泛型集合 json_将泛型集合转换成分页json数据

    [java]代码库package com.sunweb.util.jsonfactory; import java.util.List; import com.sunweb.util.jsonfact ...

  5. java泛型的作用和实现原理_java泛型的作用及实现原理

    一.泛型的介绍 泛型是Java 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数.这种参数类型可以用在类.接口和方法的创建中,分别称为泛型类.泛型接口.泛型方法. Ja ...

  6. Java 泛型的作用以及类、方法、接口的使用和通配符

    一.泛型的作用 1.集合如果不使用泛型:         存的时候什么类型都可以,但是要取的时候会懵,因为取出来啥也不是,或者不知道取的是什么类型的数据.像这样: // 创建ArrayList集合,不 ...

  7. java泛型方法作用_java泛型的作用与使用方法是什么?

    泛型,即"参数化类型".一提到参数,最熟悉的就是定义方法时有形参,然后调用此方法时传递实参.那么参数化类型怎么理解呢?顾名思义,就是将类型由原来的具体的类型参数化,类似于方法中的变 ...

  8. java泛型优点_java泛型的作用和好处

    转载于:https://blog.csdn.net/u012760183/article/details/52092692 之前参加面试的时候遇到面试官问泛型的作用,只是说了大概自己的理解, 在此转载 ...

  9. java泛型(java泛型的作用)

    java泛型的基本使用是什么? add("test1"); String test1 = (String)strList.get(0); System.out.println(&q ...

最新文章

  1. Facebook工程师教你什么是随机森林,就算零基础也可以看懂 | 干货
  2. 定制你的敏捷方法:以结果为导向
  3. 《程序员的自我修养》
  4. Java实现世代距离_IGD反转世代距离-多目标优化评价指标概念及实现
  5. freeswitch 发update sip消息_【PDA】SIP中生物学确认
  6. 利用MAVEN打包时,如何包含更多的资源文件
  7. mysql手动启动1067错误_解决MySQL启动时万恶的1067错误(转)
  8. 12月14日习题答案大剖析!html5基础测试来啦
  9. ajax获取openid,异步环境下获取 openid的几个方法
  10. Flutter之Dialog使用和踩坑
  11. 计算机创业计划书800字大全,创业计划书范文800字
  12. 鼠标钩子WH_MOUSE_LL
  13. Win7 安装 -- SHSUCDX can’t install 问题解决
  14. BEEF的简介与使用
  15. redis五种数据结构的操作命令
  16. Android 在图片的指定位置添加标记
  17. 6-5 奇数值结点链表 (20分)
  18. jmeter参数化时常用随机函数
  19. Unity中一些小技巧
  20. GB2312汉字区位码、交换码和机内码

热门文章

  1. 「资源」 Windows 强力清除软件
  2. 色相(H)饱和度(S)明度(L)与RGB的转换以及在android上的试验
  3. 干货 | 数据安全和个人信息保护审计的方法研究
  4. JAVA计算机毕业设计全屋家具定制网站(附源码、数据库)
  5. Gophers 元宵快乐哟!
  6. 重温STL, STD
  7. 服务器安全-centos7 防火墙端口设置
  8. 多大仇,这个离职证明大家怎么看?
  9. linux上lrzsz工具的安装与使用
  10. Esper学习之一:Esper介绍 .