Java泛型集合

所谓泛型就是允许在定义类、接口时指定类型形参,这个类型形参将在声明变量、创建对象时确定。增加了泛型支持后的集合,完全可以记住集合

中元素的类型,并可以在编译时检查集合中元素的类型。即解决一些安全问题,同时还可以让代码变得更加简洁。

一、使用泛型

泛型的格式:通过<>来定义要操作的引用数据类型

创建一个只存放字符串的对象,代码如下:

package com.csu.test1;

import java.util.ArrayList;
import java.util.List;

public class GenericDemo {
public static void main(String[] args) {
    //创建一个只能保存字符串的ArrayList集合
    List<String> strList=new ArrayList<String>();
    //如果存放其他类型的对象时会出现编译错误
    strList.add("chaofn");

    System.out.println(strList);
}
}

使用泛型的好处:

1、将运行时期出现的ClassCastExcpetion , 转移到了编译时期。方便于程序员解决问题,让运行时期问题减少。

2、避免了强制转换的麻烦。

如下代码可以解释这一点:

package com.csu.test1;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

 class StringDemo {

    String name;
    public StringDemo(String name){
        this.name=name;

}

}
public class GenericDemo {

public static void main(String[] args) {
    //创建一个只能保存字符串的ArrayList集合
     List ls=new ArrayList();
    //如果存放其他类型的对象时会出现编译错误
    ls.add(new StringDemo("chaofn01"));
    ls.add(new StringDemo("chaofn02"));
    ls.add(new StringDemo("chaofn03"));
    ls.add(new StringDemo("chaofn04"));
    ls.add(1000);
    MyIterator(ls);

}
public static void MyIterator(List ls){
    Iterator it=ls.iterator();
    while(it.hasNext()){
        StringDemo s=(StringDemo) it.next();
        System.out.println(s.name);
    }
}
}

运行结果:

chaofn01
chaofn02
Exception in thread "main" java.lang.ClassCastException: java.lang.Integer cannot be cast to com.csu.test1.StringDemo
    at com.csu.test1.GenericDemo.MyIterator(GenericDemo.java:34)
    at com.csu.test1.GenericDemo.main(GenericDemo.java:27)
chaofn03
chaofn04

在调用MyIterator(List ls) 方法时会发生ClassCastException 异常。而且在编译时是不会有任何提示,只有运行时会出现,所以使的程序存在安全隐患。

如果使用泛型则会在编译时提示错误,而且在遍历时不需要强制转换。如:

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

 class StringDemo {

    String name;
    public StringDemo(String name){
        this.name=name;

}

}
public class GenericDemo {

public static void main(String[] args) {
    //创建一个只能保存字符串的ArrayList集合
     List<StringDemo> ls=new ArrayList<StringDemo>();
    //如果存放其他类型的对象时会出现编译错误
    ls.add(new StringDemo("chaofn01"));
    ls.add(new StringDemo("chaofn02"));
    ls.add(new StringDemo("chaofn03"));
    ls.add(new StringDemo("chaofn04"));
    //下面一行代码在编译时会出错
    //ls.add(1000);
    MyIterator(ls);

}
public static void MyIterator(List<StringDemo> ls){
    Iterator<StringDemo> it=ls.iterator();
    while(it.hasNext()){
        //不需要强制转化成StringDemo
        StringDemo s= it.next();
        System.out.println(s.name);
    }
}
}

二、自定义泛型类:

除了Java提供了一些类增加了泛型支持外,我们可以自定义泛型支持类。

那么在什么时候定义泛型类呢?

当类中操作的引用数据类型不确定时可以定义泛型类。

格式如下:

class Tools<T>
{
}例如:定义一个Tools 类 用来完成打印操作,但是应为不知道要操作的数据类型是什么,所以可以定义成泛型类。具体操作:
//定义一个工具类Tools
 2 //因为不知道要操作的类型是什么所以增加泛型支持
 3 class Tools<T>
 4 {
 5 //    包含输出函数:
 6     public void sop(T t)
 7     {
 8         System.out.println("sop:"+t);
 9     }
10 }
11 //定义一个Books 类
12 class Books
13 {
14     private String name ;
15     public Books(String name)
16     {
17         this.name = name  ;
18     }
19 //    重写toString 方法
20     public String toString()
21     {
22         return "name = " + name ;
23     }
24 }
25 public class GenericText
26 {
27     public static void main(String[] args)
28     {
29     //    创建一个Tools 实例tool ,定义 tool 要操作的数据类型为Books
30         Tools<Books>  tool = new Tools<Books>() ;
31     //    tool 可以操作 Books 类型,还可以操作Integer 类型和String类型。
32         tool.sop(new Books("神雕侠侣"));
33     }
         }

泛型类定义的泛型,在整个类中有效,如果被方法使用,那么泛型类的对象明确要操作的具体类型后,所有要操作的类型就已经固定了。为了让不同方法可以操作不同类型,

而且类型还不确定,那么可以将泛型定义在方法上。

三、自定义泛型方法

 定义泛型方法格式如下:

    public <T> void show(T t) 注意:<>放在修饰符后面,返回值前面
        {
        }
//定义一个工具类Tools
 2 //因为不知道要操作的类型是什么所增加泛型支持
 3 class Tools<T>
 4 {
 5 //    包含输出函数:
 6     public void sop(T t)
 7     {
 8         System.out.println("sop:"+t);
 9     }
10 //    定义的泛型方法:
11     public <T> void show (T t)
12     {
13         System.out.println("show:"+t);
14     }
15 }
16 //定义一个Books 类
17 class Books
18 {
19     private String name ;
20     public Books(String name)
21     {
22         this.name = name  ;
23     }
24 //    重写toString 方法
25     public String toString()
26     {
27         return "name = " + name ;
28     }
29 }
30 public class GenericText
31 {
32     public static void main(String[] args)
33     {
34     //    创建一个Tools 实例tool ,定义 tool 要操作的数据类型为Books
35         Tools<Books>  tool = new Tools<Books>() ;
36     //    tool 可以操作 Books 类型,还可以操作Integer 类型和String类型。
37         tool.sop(new Books("神雕侠侣"));
38         tool.show(new Books("神雕侠侣")) ;
39 //        下面的方法编译时会报错》、:
40         tool.sop(1000) ;
41         tool.sop("String") ;
42
43 //        但下面却不会报错,并且正常运行。
44         tool.show(1000) ;
45         tool.show("String") ;
46     }
47 }
时间: 2024-10-07 02:42:42

Java泛型集合的相关文章

Java泛型集合的理解

转自:http://shuyangyang.blog.51cto.com/1685768/103076 ———————————————————————————————————— 什么是泛型? 泛型(Generic type 或者 generics)是对 Java 语言的类型系统的一种扩展,以支持创建可以按类型进行参数化的类.可以把类型参数看作是使用参数化类型时指定的类型的一个占位符,就像方法的形式参数是运行时传递的值的占位符一样. Map 类允许您向一个 Map 添加任意类的对象,即使最常见的情

Java基础——集合(三)——泛型、增强for、工具类

         接上篇,<Java基础--集合(二)--迭代器.Map集合> 六.泛型 (1)定义: 泛型是一种把明确类型的工作放在了创建对象或者调用方法时候才去明确的特殊的类型. (2)格式: <数据类型> ArrayList<String> aList=new ArrayList<String>(); <String> 即表示的是泛型 (3)好处:(掌握) A:解决了黄色警告线问题 B:把运行期间的转换异常给提前到了编译期间 C:优化了程序

第10篇-JAVA 集合框架-JAVA 泛型

第10篇-JAVA 集合框架-JAVA 泛型 每篇一句 :所有的不甘,都是因为还心存梦想 初学心得: 不是每件事都注定会成功,但是每件事都值得一试 (笔者:JEEP/711)[JAVA笔记 | 时间:2017-04-15| JAVA 集合框架/JAVA 泛型 ] 1.JAVA 集合框架概念 通俗的说,集合就是一个存放数据的容器,准确的说,就是放数据对象引用的容器 数组和集合都是容器,有何不同? 数组长度固定,集合长度可变 数组只能存放相同类型的数据,集合可以存放不同类型的数据 数组可存放简单数据

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

//Sets.java package org.rui.generics.set; import java.util.HashSet; import java.util.Set; /** * 一个Set有用工具 * @author lenovo * */ public class Sets { public static<T> Set<T> union(Set<T> a,Set<T> b) { Set<T> result=new HashSet&

I学霸官方免费教程三十四:Java集合框架之泛型集合

泛型集合 泛型集合不是指某种集合,而是指在集合的基础上增加了泛型. 泛型集合中,一旦传入了泛型参数"类A":则只能向这个集合中添加类A或类A子类的对象,不能添加其他对象了. 从泛型集合中获取对象时,对象的类型是类A,而不是Object类型的对象了. 泛型List 例如:上面说到的两种List集合,都可以加入泛型 package collection.list.arrayList; import java.util.ArrayList; import java.util.List; /*

Java泛型中的PECS原则

今天在写代码的时候使用到了这样一个方法签名: public void foo(Map<String, String> map); 在写这个参数的时候正好在想一些关于泛型的东西,于是: public void foo(Map<? extends String, ? extends String> map); 这两种写法有什么区别呢?记得以前和同学讨论过这个问题,但后来没有记下来,渐渐又淡忘了.今天又去翻了好多资料,总算找到一些可以参考的,赶紧记在这里方便以后温故知新啦.好了,言归正传

关于Java泛型的使用

在目前我遇到的java项目中,泛型应用的最多的就属集合了.当要从数据库取出多个对象或者说是多条记录时,往往都要使用集合,那么为什么这么使用,或者使用时有什么要注意的地方,请关注以下内容. 感谢Windstep. 原文链接:http://www.cnblogs.com/lwbqqyumidi/p/3837629.html 原文标题:Java总结篇系列:Java泛型 (我的第一篇水文,233)

java 泛型 窜讲

一.为什么使用泛型      复用性:泛型的本质就是参数化类型,因而使用编写的泛型代码可以被许多不同类型的对象所复用.      安全性:在对类型Object引用的参数操作时,往往需要进行显式的强制类型转换.这种强制类型转换需要在运行时才能被发现是否转换异常,通过引入泛型能将在运行时才能检查类型转换,提前到编译时期就能检查. 二.自定义泛型 java中自定义泛型分为三种:泛型类.泛型接口.泛型方法. 下面使用一个案例演示泛型类.泛型方法,泛型接口类似,所以不再演示. // 自定义泛型类publi

1月21日 - (转)Java 泛型

java泛型 什么是泛型? 泛型(Generic type 或者 generics)是对 Java 语言的类型系统的一种扩展,以支持创建可以按类型进行参数化的类.可以把类型参数看作是使用参数化类型时指定的类型的一个占位符,就像方法的形式参数是运行时传递的值的占位符一样. 可以在集合框架(Collection framework)中看到泛型的动机.例如,Map 类允许您向一个 Map 添加任意类的对象,即使最常见的情况是在给定映射(map)中保存某个特定类型(比如 String)的对象. 因为 M