Java泛型机制
泛型程序设计
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泛型机制的更多相关文章
- 浅析Java 泛型
泛型是JavaSE5引入的一个新概念,但是这个概念在编程语言中却是很普遍的一个概念.下面,根据以下内容,我们总结下在Java中使用泛型. 泛型使用的意义 什么是泛型 泛型类 泛型方法 泛型接口 泛型擦 ...
- java泛型笔记一
名词:泛型类 泛型方法 原始类型 子类型 版本 参数化类型 通配符类型 超类通配 子类通配 全通配 定义变量 创建对象 检查模板 类型实参 类型形参 补充 替代语法特征:尖括号括起来的类型参数表 // ...
- 用了这么多年的 Java 泛型,你对它到底有多了解?
作为一个 Java 程序员,日常编程早就离不开泛型.泛型自从 JDK1.5 引进之后,真的非常提高生产力.一个简单的泛型 T,寥寥几行代码, 就可以让我们在使用过程中动态替换成任何想要的类型,再也不用 ...
- Java泛型反射机制(二)
/** * @author Administrator * 好处:泛型:1安全 2减少代码重用率 */ package com.test; import java.lang.reflect.Metho ...
- JAVA反射机制--怎么不受泛型束缚给数组赋值
在Java中,声明数组的时候我们经常会写泛型限制用户输入或者获取的数据.如:ArrayList<String> list = new ArrayList<>(); String ...
- C++泛型 && Java泛型实现机制
C++泛型 C++泛型跟虚函数的运行时多态机制不同,泛型支持的静态多态,当类型信息可得的时候,利用编译期多态能够获得最大的效率和灵活性.当具体的类型信息不可得,就必须诉诸运行期多态了,即虚函数支持的 ...
- Java泛型(11):潜在类型机制
泛型的目标之一就是能够编写尽可能广泛应用的代码. 为了实现这一点,我们需要各种途径来放松对我们的代码将要作用的类型所做的限制,同时不丢失静态类型检查的好处.即写出更加泛化的代码. Java泛型看起来是 ...
- Java进阶 | 泛型机制与反射原理
一.泛型的概念 1.基础案例 泛型在Java中的应用非常广泛,最常见则是在集合容器中,先看下基础用法: public class Generic01 { public static void main ...
- java基础---泛型机制
从java5 开始增加泛型机制,用于明确集合中可以放入的元素类型,只在编译时期有效,运行时不区分是什么类型. 格式:<数据类型> 泛型的本质是参数化类型,让数据类型作为参数传递,E相当于形 ...
随机推荐
- 论文阅读LR LIO-SAM
Abstract 紧耦合lidar inertial里程计, 用smoothing和mapping. 1. Introduction 紧耦合lidar-inertial里程计. 紧耦合的lidar i ...
- java中token的生成和验证
package com.zjn.token; /** * token编码工具类 * @author ouyangjun */ public class TokenEncryptUtils { // 编 ...
- Promise是如何实现异步编程的?
Promise标准 不能免俗地贴个Promise标准链接Promises/A+.ES6的Promise有很多方法,包括Promise.all()/Promise.resolve()/Promise.r ...
- java JButton按钮始终居中
怎么做的拖动窗口内部的按钮始终居中呢? 很简单把按钮放入Box中进行了. 代码如下: import javax.swing.Box; import javax.swing.JButton; impor ...
- Spring Cloud Eureka 简单创建
1.pom.xml 添加相关依赖 <dependency> <groupId>org.springframework.cloud</groupId> ...
- vue项目中的字符串每隔4位一个空格
项目中遇到现实银行卡号的需求所以需要这个方法 我们这里运用 JavaScript replace()方法 replace() 方法用于在字符串中用一些字符替换另一些字符,或替换一个与正则表达式匹配的子 ...
- 在Termux(非root的安卓Linux模拟器)中安装和使用ftp服务器(pure-ftpd)(原创)[简单极致]
Termux是单用户的linux模拟器,所以应用的专属文件夹下面.usr/etc/下面没有passwd和group文件对多用户组配置,只在.usr/bin/下面有passwd二进制应用可以改变当前用户 ...
- Lesson_strange_words3
can 电话耳机,(头戴式听筒) determine 决定 perform 执行 regular 常规的 duty 责任 compatible 兼容 preset 预置,预设 in either or ...
- WPF DataGrid与ListView性能对比与场景选择
开门见山的说 性能对比: 在Demo中,DataGrid与ListView默认开启虚拟化(可以理解为动态渲染,类似懒加载只渲染屏幕可以看见的地方) DataGrid渲染10列50行随机字符280ms ...
- laravel邮件发送
laravel邮件发送 使用邮件发送类Mail 文本 静态方法 raw() 富文本 静态方法 send() 注:使用邮件发送必须有邮件账号,需要开启smtp协议,现在主流服务器都支持,smtp默认端口 ...