泛型

 泛型提供了编译时类型安全检测机制,该机制允许程序员在编译时检测到非法的类型。

理解

 为了可以进一步理解泛型,我们先来看一个问题

需求:

 编写一个程序,在ArrayList中添加三个对象,类中要有name、age属性,输出对象的name、age属性

  • 首先,我们先用传统方法进行编写
package com.sxny;

import java.util.ArrayList;

public class text {
public static void main(String[] args) {
ArrayList arrayList = new ArrayList();
arrayList.add(new Person("王五",55));
arrayList.add(new Person("李四",12));
arrayList.add(new Person("王五",8));
arrayList.add(new Animal("奶盖",2));
for (Object o:arrayList){ //增强for循环
Person person = (Person)o;
System.out.println(person);
}
}
}
class Person{
private String name;
private int age; public Person(String name, int age) {
this.name = name;
this.age = age;
} @Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
class Animal{
private String name;
private int age;
public Animal(String name,int age){
this.name = name;
this.age = age;
} @Override
public String toString() {
return "Animal{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}

​​ 从上图我们可以看到,用传统方法,会出现ClassCastException异常, 其原因主要是传统方法中,需要进行类型的转换。Person在进入Arraylist中时会转换成Object类型,在取出时又会转回Person类型。

  • 针对以上问题,现在我们利用泛型来解决
package com.sxny;

import java.util.ArrayList;

public class text {
public static void main(String[] args) {
ArrayList<Person> arrayList = new ArrayList<Person>();
arrayList.add(new Person("王五",55));
arrayList.add(new Person("李四",12));
arrayList.add(new Person("王五",8));
// arrayList.add(new Animal("奶盖",2));
for (Object o:arrayList){ //增强for循环
Person person = (Person)o;
System.out.println(person);
}
}
}
class Person{
private String name;
private int age; public Person(String name, int age) {
this.name = name;
this.age = age;
} @Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
class Animal{
private String name;
private int age;
public Animal(String name,int age){
this.name = name;
this.age = age;
} @Override
public String toString() {
return "Animal{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}

 在创建Arraylist时限制了添加元素的类型, Arraylist arraylist = new Arraylist()若发现类型不符合,则会报错,并且在遍历时无需类型的转换,因此,解决了ClassCastException异常的问题。

使用泛型的好处

  • 编译时,检查添加的元素,增加了安全性。
  • 无需数据类型的转换,提高了效率。
  • 不再提示警告。

类通配符

 通常类通配符使用 ?代替具体的类型参数。例如,List<?>逻辑上是List<Integer>List<String>等所有List<类型>的父类。

Java基础 —— 泛型的更多相关文章

  1. 一天一个Java基础——泛型

    这学期的新课——设计模式,由我仰慕已久的老师传授,可惜思维过快,第一节就被老师挑中上去敲代码,自此在心里烙下了阴影,都是Java基础欠下的债 这学期的新课——算法设计与分析,虽老师不爱与同学互动式的讲 ...

  2. Java 基础 -- 泛型、集合、IO、反射

    package com.java.map.test; import java.util.ArrayList; import java.util.Collection; import java.util ...

  3. java基础-泛型举例详解

    泛型 泛型是JDK5.0增加的新特性,泛型的本质是参数化类型,即所操作的数据类型被指定为一个参数.这种类型参数可以在类.接口.和方法的创建中,分别被称为泛型类.泛型接口.泛型方法. 一.认识泛型 在没 ...

  4. Java基础 - 泛型详解

    2022-03-24 09:55:06 @GhostFace 泛型 什么是泛型? 来自博客 Java泛型这个特性是从JDK 1.5才开始加入的,因此为了兼容之前的版本,Java泛型的实现采取了&quo ...

  5. java基础-泛型3

    浏览以下内容前,请点击并阅读 声明 8 类型擦除 为实现泛型,java编译器进行如下操作进行类型擦除: 如果类型参数有限制则替换为限制的类型,如果没有则替换为Object类,变成普通的类,接口和方法. ...

  6. java基础 泛型

    泛型的存在,是为了使用不确定的类型. 为什么有泛型? 1. 为了提高安全 2. 提高代码的重用率 (自动 装箱,拆箱功能) 一切好处看代码: package test1; import java.la ...

  7. java基础-泛型2

    浏览以下内容前,请点击并阅读 声明 6 类型推测 java编译器能够检查所有的方法调用和对应的声明来决定类型的实参,即类型推测,类型的推测算法推测满足所有参数的最具体类型,如下例所示: //泛型方法的 ...

  8. java基础-泛型1

    浏览以下内容前,请点击并阅读 声明 泛型的使用能使类型名称作为类或者接口定义中的参数,就像一般的参数一样,使得定义的类型通用性更强. 泛型的优势: 编译具有严格的类型检查 java编译器对于泛型代码的 ...

  9. Java基础---泛型、集合框架工具类:collections和Arrays

    第一讲     泛型(Generic) 一.概述 1.JDK1.5版本以后出现的新特性.用于解决安全问题,是一个类型安全机制. 2.JDK1.5的集合类希望在定义集合时,明确表明你要向集合中装入那种类 ...

  10. Java基础——泛型

    一.定义 泛型(generic)是指参数化类型的能力.可以定义带泛型类型的类或方法,随后编译器会用具体的类型来替换它(泛型实例化).使用泛型的主要优点是能够在编译时,而不是在运行时检测出错误.它是jd ...

随机推荐

  1. 痞子衡嵌入式:如果i.MXRT离线无法启动,试着分析ROM启动日志

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是恩智浦i.MXRT系列MCU的ROM启动日志. 关于 i.MX RT 启动问题解决的文章,痞子衡写过非常多,其中大部分都是具体到某一类启 ...

  2. MySQL 用户、权限管理,C/C++连接与使用

    目录 用户 用户管理 查询所有用户 查看当前用户 查看当前连接数 创建用户 删除用户 修改密码规则 查看规则/策略 规则说明 临时设置 持久设置 修改密码 权限 数据库提供的 权限列表 查看权限 给用 ...

  3. 国庆快乐!附ssh实战

    小伙伴们,有一段时间没更新了,目前在中科院软件所实习,在这里我祝大家国庆快乐! 今天这一期带来ssh命令的实战教程,ssh在工作当中遇到的非常多,因为总是需要登服务器,而且玩法也有不少,这是我常用的几 ...

  4. Oracle 23c 新特性实操体验优质文章汇总 | 有奖征文进行中欢迎参与

    继4月3日甲骨文宣布推出免费开发者版 Oracle Database 23c后,墨天轮社区发起 "Oracle 23c 免费开发者版特性体验"有奖征文活动,邀请大家分享Oracle ...

  5. 00 你想要学习的 AI+Python,捷径在这里

    博客配套视频链接: https://space.bilibili.com/383551518?spm_id_from=333.1007.0.0 b 站直接看 配套 github 链接:https:// ...

  6. 阿里云服务器安装mysql镜像

    新创建的服务器首先需要创建安全组,开放端口然后重启服务器 登陆远程服务器,具体操作步骤如下 #拉取镜像 docker pull mysql:5.7 #查看镜像是否拉取到 docker images # ...

  7. 云原生周刊:Dapr v1.11 发布

    开源项目推荐 Kamaji Kamaji 可以大规模地部署和运行 Kubernetes 控制平面,而只需承担一小部分操作负担.Kamaji 的特别之处在于,控制平面组件是在一个单一的 pod 中运行, ...

  8. Nuxt.js 应用中的 app:resolve 事件钩子详解

    title: Nuxt.js 应用中的 app:resolve 事件钩子详解 date: 2024/10/17 updated: 2024/10/17 author: cmdragon excerpt ...

  9. PHP中$GLOBALS和global的区别,简单了解符号表、zval

    前言 单位里有一套老代码,写了这么一个换库逻辑. function conn() { global $conn; if ($conn) { unset($conn); } $conn = mysqli ...

  10. Vue写一个图片轮播组件【转载】

    一.理清思路,理解需求和原理 1. 要写一个什么样的轮播? 在点击右侧箭头时,图片向左滑动到下一张:点击左侧箭头时,图片向右滑到下一张 点击下面的小圆点,滑到对应的图片,相应小圆点的样式也发生改变 要 ...