泛型程序设计

1、泛型程序设计的起源?

泛型是JDK1.5增加的新特性。

2、使用泛型的好处?

使用泛型机制编写的代码比那些杂乱使用Object变量,然后再进行强制类型转换的代码具有更好的安全性和可读性。

public class GenericTest01 {

public static void main(String[] args) {

/*
// 创建一个集合
List list = new ArrayList();

// 创建对象
Cat c = new Cat();
Bird b = new Bird();

// 添加对象
list.add(c);
list.add(b);

// 遍历集合
Iterator integer = list.iterator();
while (integer.hasNext()) {
Object obj = integer.next();
if (obj instanceof Animal) {
Animal a = (Animal)obj;
a.move();
}
}*/

// 创建集合,使用泛型
List<Animal> list = new ArrayList<Animal>();
Cat c = new Cat();
Bird b = new Bird();

list.add(c);
list.add(b);

// 获取迭代器
// 这个表示迭代器迭代的是Animal类型
Iterator<Animal> iterator = list.iterator();
while (iterator.hasNext()) {
Animal a = iterator.next();
a.move();
}
  }
}
class Animal {
public void move() {
System.out.println("动物在移动");
}
}

class Cat extends Animal {
public void CatchMouse() {
System.out.println("猫抓老鼠!");
}
}

class Bird extends Animal {
public void Fly() {
System.out.println("鸟儿在飞翔!");
}
}

3、泛型的缺点是什么?
使集合中的元素单一,但是在大多数业务中,集合中的元素是统一的,所以这种新特性逐渐被大家认可。

4、砖石表达式
JDK8之后引入了:自动类型推断机制。(又称为砖石表达式)
public class GenericTest02 {
public static void main(String[] args) {

// 使用泛型,创建一个Animal类型的数组
List<Animal> list = new ArrayList<>();

// 添加元素
list.add(new Animal());
list.add(new Cat());
list.add(new Bird());

// 遍历集合
// 不使用泛型默认返回的是Object类型
Iterator<Animal> iterator = list.iterator();
while (iterator.hasNext()) {
Animal animal = iterator.next();
animal.move();
}

List<String> stringList = new ArrayList();

// 类型不匹配
// stringList.add(new Animal());
// stringList.add(123);
// stringList.add(new Object());

// 添加元素
stringList.add("http://www.baidu.com");
stringList.add("http://www.4399.com");
stringList.add("http://www.7k7k.com");

// 遍历

Iterator<String> it = stringList.iterator();
while (it.hasNext()) {

/* 如果没有使用泛型,以下代码就得这样写
Object o = it.next();
if (o instanceof String) {
String s1 = (String) o;
String newString = s1.substring(7);
System.out.println(newString);
}*/
// 直接通过迭代器获取了String类型的数据
String s = it.next();
String s1 = (String) s;
String newString = s1.substring(7);
System.out.println(newString);
}
}
}
5、自定义泛型

自定义泛型的时候,尖括号中是一个标识符,可以随便写。
java源代码中经常出现的是:<E>和<T> E是Element首字母大写,T是Tyte首字母大写

public class GenericTest03<A> {
public void doSome(A o) {
System.out.println(o);
}

public static void main(String[] args) {

GenericTest03<String> gt1 = new GenericTest03<>();
// 类型不匹配
// gt1.doSome(100);

gt1.doSome("abc");

GenericTest03<Integer> gt2 = new GenericTest03<>();
// 类型不匹配
// gt2.doSome("abc");

gt2.doSome(100);

GenericTest03 gt3 = new GenericTest03<>();
gt3.doSome(new Object());

MyIterator<String> mi = new MyIterator<>();
String s1 = mi.get();

MyIterator<Animal> mi2 = new MyIterator<>();
Animal a1 = mi2.get();
}
}

class MyIterator<T> {
public T get() {
return null;
}
}
 
 
    
 
 


Java泛型机制的更多相关文章

  1. 浅析Java 泛型

    泛型是JavaSE5引入的一个新概念,但是这个概念在编程语言中却是很普遍的一个概念.下面,根据以下内容,我们总结下在Java中使用泛型. 泛型使用的意义 什么是泛型 泛型类 泛型方法 泛型接口 泛型擦 ...

  2. java泛型笔记一

    名词:泛型类 泛型方法 原始类型 子类型 版本 参数化类型 通配符类型 超类通配 子类通配 全通配 定义变量 创建对象 检查模板 类型实参 类型形参 补充 替代语法特征:尖括号括起来的类型参数表 // ...

  3. 用了这么多年的 Java 泛型,你对它到底有多了解?

    作为一个 Java 程序员,日常编程早就离不开泛型.泛型自从 JDK1.5 引进之后,真的非常提高生产力.一个简单的泛型 T,寥寥几行代码, 就可以让我们在使用过程中动态替换成任何想要的类型,再也不用 ...

  4. Java泛型反射机制(二)

    /** * @author Administrator * 好处:泛型:1安全 2减少代码重用率 */ package com.test; import java.lang.reflect.Metho ...

  5. JAVA反射机制--怎么不受泛型束缚给数组赋值

    在Java中,声明数组的时候我们经常会写泛型限制用户输入或者获取的数据.如:ArrayList<String> list = new ArrayList<>(); String ...

  6. C++泛型 && Java泛型实现机制

    C++泛型  C++泛型跟虚函数的运行时多态机制不同,泛型支持的静态多态,当类型信息可得的时候,利用编译期多态能够获得最大的效率和灵活性.当具体的类型信息不可得,就必须诉诸运行期多态了,即虚函数支持的 ...

  7. Java泛型(11):潜在类型机制

    泛型的目标之一就是能够编写尽可能广泛应用的代码. 为了实现这一点,我们需要各种途径来放松对我们的代码将要作用的类型所做的限制,同时不丢失静态类型检查的好处.即写出更加泛化的代码. Java泛型看起来是 ...

  8. Java进阶 | 泛型机制与反射原理

    一.泛型的概念 1.基础案例 泛型在Java中的应用非常广泛,最常见则是在集合容器中,先看下基础用法: public class Generic01 { public static void main ...

  9. java基础---泛型机制

    从java5 开始增加泛型机制,用于明确集合中可以放入的元素类型,只在编译时期有效,运行时不区分是什么类型. 格式:<数据类型> 泛型的本质是参数化类型,让数据类型作为参数传递,E相当于形 ...

随机推荐

  1. SpringBoot异常处理(二)

    参数校验机制 JSR-303 Hibernate 参数接收方式: URL路径中的参数 {id} (@PathVariable(name="id") int-whatever) UR ...

  2. CVE-2021-3019 漏洞细节纰漏

    CVE编号 CVE-2021-3019 lanproxy任意文件读取 该漏洞是2021年比较新的漏洞 是否需要认证:否 是否执行远程代码:否 是否执行远程命令:否 数据读取是否内网:否 漏洞软件介绍 ...

  3. java容器-Collection

    1.介绍    collection<E>是java中容器的最主要的接口,该接口继承于Iterable<E>,使得java中所有实现Collection<E>的容器 ...

  4. VUE项目性能优化实践——通过懒加载提升页面响应速度

    本文由葡萄城技术团队原创并首发 转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. 最近我司因业务需求,需要在一个内部数据分析平台集成在线Excel功能,既然我 ...

  5. 多图详解Go中的Channel源码

    转载请声明出处哦~,本篇文章发布于luozhiyun的博客:https://www.luozhiyun.com 本文使用的go的源码时14.4 chan介绍 package main import & ...

  6. Linux LVM Logical Volume Management 逻辑卷的管理

    博主是一个数据库DBA,但是一般来说,是不做linux服务器LVM 逻辑卷的创建.扩容和减容操作的,基本上有系统管理员操作,一是各司其职,专业的事专业的人做,二是做多了你的责任也多了,哈哈! 但是li ...

  7. Linux 入门教程:00 Background

    Linux 为何物? 就是一个操作系统. Linux 历史: 操作系统始于二十世纪五十年代,当时的操作系统能运行批处理程序.批处理程序不需要用户的交互,它从文件或者穿孔卡片读取数据,然后输出到另外一个 ...

  8. 关联实现上-jsonpath取值

    举例子: demo01.py import jsonimport requestsimport jsonpathsession = requests.session()get_param_dict={ ...

  9. 2019 Eclipse的下载与安装教程

    Eclipse 是一个开放源代码的.基于Java的可扩展开发平台,可以免费下载使用. 首先我们先进入这个软件的官网:https://www.eclipse.org/ 点击这个网页download下载: ...

  10. 【数据库】MySQL & SQL 介绍

    文章目录 MySQL & SQL 介绍 1.MySQL的背景 2.MySQL的优点 3.MySQL的安装 4.MySQL服务的启动和停止 方式一 方式二 5.MySQL服务的登录和退出 方式一 ...