泛型:就是变量类型的参数化

泛型是JDK1.5中的一个最重要的特征。通过引入泛型,我们将获得编译时类型的安全和运行时更小的抛出ClassCastException的可能。

public class ArrayListTest {
public static void main(String[] args) {
List list = new ArrayList();
list.add("Nick");
list.add(new Integer(20));
list.add(new Boolean(false)); String str = (String) list.get(0);
Integer in = (Integer)list.get(1);
String b = (String)list.get(2); }
}

  运行后,String b = (String)list.get(2);将抛出异常

Exception in thread "main" java.lang.ClassCastException: java.lang.Boolean cannot be cast to java.lang.String
at com.example.fanxing.ArrayListTest.main(ArrayListTest.java:16)

  

定义两个类,如下图

以上两个类结构时一致的,如果在增加一种类型,如String,还需要创建StringDemo类。

可以优化成一个类统一处理:

public class ObjectDemo {

	private Object falg ;

	public Object getFalg() {
return falg;
} public void Integer(Object falg) {
this.falg = falg;
} }

  然后使用ObjectDemo

public static void main(String[] args) {
ObjectDemo obj1 = new ObjectDemo();
obj1.SetFlag("Nick");
String falg = (String)obj1.getFalg();
System.out.println("falg:" + falg); ObjectDemo obj2 = new ObjectDemo();
obj2.SetFlag(new Integer(20));
Integer falg2 = (Integer)obj2.getFalg();
System.out.println("falg2:" + falg2); String falg3 = (String)obj2.getFalg();
System.out.println("falg3:" + falg3); }

  

然后String falg3 = (String)obj2.getFalg();异常

java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String
at com.example.fanxing.ObjectDemo.main(ObjectDemo.java:27)

  

2、泛型的使用

public class GenericFlag<T> {

	private T  flag;

	public T getFlag() {
return flag;
} public void setFlag(T flag) {
this.flag = flag;
} public static void main(String[] args) {
GenericFlag<Boolean> flag1 = new GenericFlag<Boolean>();
flag1.setFlag(new Boolean(false)); GenericFlag<Integer> flag2 = new GenericFlag<Integer>();
flag2.setFlag(new Integer(20)); Boolean f1 = flag1.getFlag();
System.out.println("f1: " + f1); Integer f2 = flag2.getFlag();
System.out.println("f2: " + f2);
}
}

  

3、两个泛型的实现方式

public class Generic<T1, T2> {

	private T1 flag1;

	private T2 flag2;

	public T1 getFlag1() {
return flag1;
} public void setFlag1(T1 flag1) {
this.flag1 = flag1;
} public T2 getFlag2() {
return flag2;
} public void setFlag2(T2 flag2) {
this.flag2 = flag2;
} public static void main(String[] args) {
Generic<Integer, Boolean> flag = new Generic<Integer, Boolean>(); flag.setFlag1(new Integer(20));
flag.setFlag2(new Boolean(false)); System.out.println(flag.getFlag1());
System.out.println(flag.getFlag2());
} }

  

4、数组类型的泛型

public class Generic2<T> {

	private T[] flagArray;

	public T[] getFlagArray() {
return flagArray;
} public void setFlagArray(T[] flagArray) {
this.flagArray = flagArray;
} public static void main(String[] args) {
Generic2<String> flag = new Generic2<String>();
String[] str1 = {"Nick","Tom","Larry"}; String[] str2 = null; flag.setFlagArray(str1); str2 = flag.getFlagArray(); for(int i = 0; i< str2.length ; i++){
System.out.println(str2[i]);
}
}
}

  

5、模拟ArrayList功能

public class SimpleCollection<T> {

	private T[] objArr;

	private int index = 0;

	public SimpleCollection() {
objArr = (T[]) new Object[10];
} public SimpleCollection(int capacity) {
objArr = (T[]) new Object[capacity];
} public void add(T t) {
objArr[index++] = t;
} public int getLength() {
return this.index;
} public T get(int i){
return objArr[i];
} public static void main(String[] args) {
SimpleCollection<Integer> s = new SimpleCollection<Integer>();
for(int i = 0; i < 10; i++){
s.add(new Integer(i));
} for(int i = 0; i < 10; i++){
Integer in = s.get(i);
System.out.println(in);
}
} }

 打印结果

0
1
2
3
4
5
6
7
8
9

  

 6、泛型的泛型

/**
* 泛型的泛型
*
*/
public class WrapperFlag<T> {
private GenericFlag3<T> flag; public GenericFlag3<T> getFlag() {
return flag;
} public void setFlag(GenericFlag3<T> flag) {
this.flag = flag;
} public static void main(String[] args) {
GenericFlag3<Integer> flag = new GenericFlag3<Integer>();
flag.setFlag(100); WrapperFlag<Integer> wrapperFlag = new WrapperFlag<Integer>();
wrapperFlag.setFlag(flag); GenericFlag3<Integer> g = wrapperFlag.getFlag();
System.out.println(g.getFlag());
} } class GenericFlag3<T>{
private T flag; public T getFlag() {
return flag;
} public void setFlag(T flag) {
this.flag = flag;
} }

  

6、Set泛型

public class SetTest {

	public static void main(String[] args) {
Set<String> set = new HashSet<String>();
set.add("a1");
set.add("a2");
set.add("a3"); for(Iterator<String> iterator = set.iterator(); iterator.hasNext();){
String value = iterator.next();
System.out.println(value);
}
} }

  

7、Set泛型,类型为对象Student

public class SetTest {

	public static void main(String[] args) {

		Set<Student> set2 = new HashSet<Student>();
set2.add(new Student("tom", 20, "shanghai"));
set2.add(new Student("Jack", 30, "ShangHai"));
set2.add(new Student("Nick", 40, "YunNan")); for(Iterator<Student> iterator = set2.iterator(); iterator.hasNext();){
Student student = iterator.next();
String name = student.getName();
int age = student.getAge();
String address = student.getAddress();
System.out.println(name + "," + age +"," + address);
}
} } class Student{
private String name;
private int age;
private String address; public Student(String name, int age, String address) {
this.name = name;
this.age = age;
this.address = address;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((address == null) ? 0 : address.hashCode());
result = prime * result + age;
result = prime * result + ((name == null) ? 0 : name.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Student other = (Student) obj;
if (address == null) {
if (other.address != null)
return false;
} else if (!address.equals(other.address))
return false;
if (age != other.age)
return false;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
} }

  

8、Map泛型

public class MapTest {

	public static void main(String[] args) {
Map<String, String> map = new HashMap<String, String>();
map.put("a", "aa");
map.put("b", "bb");
map.put("c", "cc");
map.put("d", "dd"); //方式一
Set<String> set = map.keySet();
for(Iterator<String> iter = set.iterator(); iter.hasNext();){
String key = iter.next();
String value = map.get(key);
System.out.println("key:" + key + " value:" + value);
} System.out.println("--------------------"); //方式二
Set<Map.Entry<String, String>> entriesSet = map.entrySet();
for(Iterator<Map.Entry<String, String>> iter = entriesSet.iterator(); iter.hasNext();){
Map.Entry<String, String> entry = iter.next();
String key = entry.getKey();
String value = entry.getValue();
System.out.println("key:" + key + " value:" + value); }
}
}

  

Java 泛型 (Generics)的更多相关文章

  1. Java 泛型(Generics)

    Generics, 类似C++中的模版. 允许在定义类和接口的时候使用类型参数(type parameters), 声明的类型参数在使用的时候用具体的类型来替换. 如 ArrayList<Str ...

  2. Java 泛型(Generics) 综述

    一. 引子 一般的类和方法.仅仅能使用详细类型:要么是基本类型.要么是自己定义类型.假设要编写能够应用于多种类型的代码,这样的刻板的限制对代码的束缚就会非常大. 多态算是一种泛化机制,但对代码的约束还 ...

  3. 【Java心得总结三】Java泛型上——初识泛型

    一.函数参数与泛型比较 泛型(generics),从字面的意思理解就是泛化的类型,即参数化类型.泛型的作用是什么,这里与函数参数做一个比较: 无参数的函数: public int[] newIntAr ...

  4. Java深度历险(五)——Java泛型

      作者 成富 发布于 2011年3月3日 | 注意:QCon全球软件开发大会(北京)2016年4月21-23日,了解更多详情!17 讨论 分享到:微博微信FacebookTwitter有道云笔记邮件 ...

  5. Java泛型学习笔记 - (七)浅析泛型中通配符的使用

    一.基本概念:在学习Java泛型的过程中, 通配符是较难理解的一部分. 主要有以下三类:1. 无边界的通配符(Unbounded Wildcards), 就是<?>, 比如List< ...

  6. java 深度探险 java 泛型

    Java泛型(generics)是JDK 5中引入的一个新特性,允许在定义类和接口的时候使用类型参数(type parameter).声明的类型参数在使用时用具体的类型来替换.泛型最主要的应用是在JD ...

  7. Java泛型总结

    1. 什么是泛型?泛型(Generic type 或者 generics)是对 Java 语言的类型系统的一种扩展,以支持创建可以按类型进行参数化的类.可以把类型参数看作是使用参数化类型时指定的类型的 ...

  8. Java泛型的好处

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

  9. java泛型的讲解

    java泛型 什么是泛型? 泛型(Generic type 或者 generics)是对 Java 语言的类型系统的一种扩展,以支持创建可以按类型进行参数化的类.可以把类型参数看作是使用参数化类型时指 ...

  10. java 泛型深入之Set有用工具 各种集合泛型深入使用演示样例,匿名内部类、内部类应用于泛型探讨

    java 泛型深入之Set有用工具 各种集合泛型深入使用演示样例,匿名内部类.内部类应用于泛型探讨 //Sets.java package org.rui.generics.set; import j ...

随机推荐

  1. M - Ordering Tasks(拓扑排序)

    M - Ordering Tasks Time Limit:3000MS     Memory Limit:0KB     64bit IO Format:%lld & %llu Descri ...

  2. 为群晖加把锁:使用ssh密钥保障数据安全

    对每一个使用群晖nas的人而言,能保证群晖里保存的数据不被未经授权的人访问下载甚至破坏可能是最重要的事情.但数据只要上网,就免不了担心密码被破解,群晖被侵入.现在网络上,要破解密码可能是最简单不过的事 ...

  3. Linux/Windows下安装SonarCube

    1. 下载合适的版本,尽量不要下载最新的版本,最新的版本要求Java 11+,如果没有安装最新版的Java的话,尽量用 SonarQube 7.0 以下的版本,SonarQube 7.0是可以用jdk ...

  4. Luogu-P1450 [HAOI2008]硬币购物-完全背包+容斥定理

    Luogu-P1450 [HAOI2008]硬币购物-完全背包+容斥定理 [Problem Description] 略 [Solution] 上述题目等价于:有\(4\)种物品,每种物品有\(d_i ...

  5. 矩阵迹 tr(AB)=tr(BA)的证明

    其实更为直观的理解是:AB与BA具有相同的对角线元素,因此tr(AB)=tr(BA)必然成立 ref:https://blog.csdn.net/silence1214/article/details ...

  6. vscode常用快捷键总结

    记住快捷键能够提高工作效率 Ctrl+Shift+P,F1 展示全局命令面板 Ctrl+P 快速打开最近打开的文件 Ctrl+Shift+N 打开新的编辑器窗口 Ctrl+Shift+W 关闭编辑器 ...

  7. Centos6 克隆后简单的网络配置

    第一步:修改主机名 $ vi /etc/sysconfig/network     第二步: $ vi  /etc/udev/rules.d/70-persistent-net.rules   注: ...

  8. java singleton(单例设计模式)

    单例设计模式的主要作用是: 1.控制资源的使用,我们对资源使用线程同步来实现并发访问. 2.节约资源,我们对一个类只进行一个实例化进行全局的资源访问,节约了内存. 3.作为通信媒介,也是数据共享,可以 ...

  9. Java设计模式的6大原则

    Java设计模式的6大原则 1.开闭原则(Open Close Principle) 开闭原则就是说对扩展开放,对修改关闭.在程序需要进行拓展的时候,不能去修改原有的代码,实现一个热插拔的效果.简单来 ...

  10. Hibernate的持久化对象

     Hibernate的持久化类 什么是持久化类        1. 持久化类:就是一个Java类(咱们编写的JavaBean),这个Java类与表建立了映射关系就可以成为是持久化类.        * ...