泛型程序设计

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. 第一个开源控件:Google 官方下拉刷新控件 SwipeRefreshLayout 强化版,支持上拉刷新

    最近比较闲,所以趁着这时间撸了个SwipeRefreshLayout的加强版,Github地址. 原版只支持下拉刷新,强化之后支持上拉刷新和一进入页面就加载刷新,整个控件的加载动画是一致的,毫无违和感 ...

  2. nohup命令说明-转载

    转自:https://www.ibm.com/developerworks/cn/linux/l-cn-nohup/ 我们知道,当用户注销(logout)或者网络断开时,终端会收到 HUP(hangu ...

  3. @Transactional注解失效的解决方案

    一.前言 开发中我们经常使用 @Transactional注解来启用Spring事务管理,但是如果使用方法不当,会遇到注解不生效该事务回滚的地方却没有回滚的问题. 总结下一般是以下几个原因: @Tra ...

  4. Linux常用文件类别

    Linux下的文件可以分为5种不同的类型:普通文件.目录文件.链接文件.设备文件.与管道文件. 1.普通文件 它最常使用的一类文件,其特点是不包含有文件系统的结构信息.通常用户所接触到的文件,如图形文 ...

  5. JAVA_基础IO流对象流(三)

    处理流:对象流 ObjectInputStream和OjbectOutputSteam用于存储和读取基本数据类型数据或对象的处理流.可以把Java中的对象写入到数据源中,也能把对象从数据源中还原回来. ...

  6. 【项目实践】SpringBoot三招组合拳,手把手教你打出优雅的后端接口

    以项目驱动学习,以实践检验真知 前言 一个后端接口大致分为四个部分组成:接口地址(url).接口请求方式(get.post等).请求数据(request).响应数据(response).如何构建这几个 ...

  7. Spring(2) --Bean相关

    你对Spring中的bean了解吗?都有哪些作用域(Scope)? Spring 官方文档对 bean 的解释是: In Spring, the objects that form the backb ...

  8. 【Java基础】多线程

    多线程 基本概念 程序(program)是为完成特定任务.用某种语言编写的一组指令的集合.即指一段静态的代码,静态对象. 进程(process)是程序的一次执行过程,或是正在运行的一个程序.是一个动态 ...

  9. 剑指offer-56数组中数字出现的次数

    题目 一个整型数组 nums 里除两个数字之外,其他数字都出现了两次.请写程序找出这两个只出现一次的数字.要求时间复杂度是O(n),空间复杂度是O(1). 输入:nums = [4,1,4,6] 输出 ...

  10. 【TNS】listener.ora模板;tnsnames.ora模板

    好多人使用监听的时候误操作,将监听弄的不好使了,这次这个模板,不光是针对大家出现的这种问题,也是给我自己留一个记录,方便他人,方便自己. listener.ora模板样例 -------------- ...