Java学习笔记_26_泛型概述(一)

2014-11-23 19:28:33 · 作者: · 浏览: 36

泛型概述

在Java中存入容器中的对象再取出时需要转换类型,因为对象加入容器会被转换成Object类型,而取出时要转换成实际类型。但向 下类型转换都 是存在潜在危险的,因此应该尽量避免它们。

Java的泛型:

所谓泛型就是在定义(类、方法、形参、成员变量等等)的时候,指 定它们为通用类型,也就是数据类型可以是任意类型。

泛型为提高大型程序的类型安全和维护带来了很大的潜力。


使用泛型的目的:

努力将运行时异常转换成编译时的错误,减少运行时异常的数量。

解决模板编程的问题。

1. 泛型的声明:

在定义泛型类的时候,在<>中定义形式类型参数,例如:

Class TestJava 、Class TestList 、Class TestVector ,

其中

K:键,比如映射的键。

V:值,比如Set、List、Map中的值。

E:异常类。

T : 泛型。

在实例化泛型对象的时候,一定要在类名后面指定类型参数的值,如:

List list = new ArrayList ():

2. 泛型的使用:

1>消除类型的转换:

下面是消除类型转换的例子:

import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;

 public class CollectionsTest {

	public static void main(String[] args) {
		// 声明ArrayList对象 ,且list中只能存储String类元素
		List
   
     list = new ArrayList
    
     (); // 向数组列表中添加元素 list.add("1abc"); list.add("2def"); list.add("3hij"); list.add("4klm"); // 取得list元素并输出,无须类型转换 System.out.print("输出第四个元素:"); String str = list.get(3); System.out.println(str); System.out.println("\n输出列表中的所有元素:"); for (String s : list) { System.out.println(s); } System.out.println(); // 声明一个HashMap对象,指定键的类型为Integer、值的类型为String Map
     
       map = new HashMap
      
       (); // 向对象中添加元素 map.put(1, "zhao"); map.put(2, "qian"); map.put(3, "sun"); map.put(4, "li"); // 取得键集 Set
       
         keys = map.keySet(); // 由键取得对应的值,并输出 System.out.println("输出: key=value"); for (Integer i : keys) { String value = map.get(i); System.out.println(i + "=" + value); } } }
       
      
     
    
   

输出结果:

输出第四个元素:4klm

输出列表中的所有元素:

1abc

2def

3hij

4klm

输出: key=value

1=zhao

2=qian

3=sun

4=li

注:

属性中使用集合时不指定泛型,默认为 ,如定义属性: List list=null;

泛型不同的引用不能相互赋值。

加入集合中的对象类型必须与指定的泛型类型一一致。

2>限制泛型中类型参数的使用:

: 允许所有泛型的引用调用。

: 只允许泛型为Number及Number子类的引用调用。

: 只允许泛型为Number及Number父类的引用调用。

: 只允许泛型为实现Comparable接口的实现类的引用调用。

注:

方法参数中使用集合时不指定泛型默认为 .

方法参数中 这种修饰符是不 支持的。

下面的例子演示限制类型的参数的范围:

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

public class CollectionsTest {

	public static void main(String[] args) {
		List
      
        l1 = new ArrayList
       
        (); l1.add("China"); List
         l2 = new ArrayList(); l2.add(99); List
          
            l3 = new ArrayList
           
            (); l3.add(3.3); List
            
              l4 = new ArrayList
             
              (); l4.add(83); List
              
                l5 = new ArrayList
               
                (); l5.add(93.67); printView(l1);//String类型的泛型对象 printView(l2);//Object类型的泛型对象 printView(l3);//Number类型的泛型对象 printView(l4);//Integer类型的泛型对象 printView(l5);//Double类型的泛型对象 } //方法参数中使用集合时不指定泛型,默认为
                 @SuppressWarnings("rawtypes") private static void printView(List list) { for (Object o : list) { System.out.println(o); } } }  
                

输出结果:

China

99

3.3

83

93.67

(1)当上面例子中的方法变为:

 //允许所有的泛型的引用调用
   @SuppressWarnings("rawtypes")
  private static void printView(List
                   list) {
	 for (Object o : list) {
		 System.out.println(o);
	 }
  }

时,输出结果:

China

99

3.3

83

93.67

可见输出结果是不变的。

(2)当上面例子中的方法变为:

//允许Number及Number的自类的引用调用
	@SuppressWarnings("rawtypes")
	private static void printView(List
                   list) {
		for (Object o : list) {
			System.out.println(o);
		}
	}

此时需要注释掉两行:

 // printView(l1);//String类型的泛型对象
  // printView(l2);//Object类型的泛型对象

运行,

输出结果:

3.3

83

93.67

(3)当上面例子的方法变为:

 //只允许实现了Comparable接口的类的引用调用
	@SuppressWarnings("rawtypes")
	private static void printView(List
                   list)    
    {
		for (Object o : list) {
			System.out.println(o);
		}
	}

此时需要注释掉两行:

// printView(l2);//Object类型的泛型对象
 //	printView(l3);//Number类型的泛型对

运行,

输出结果:

China

8