java(16) - 泛型

原创 2013年12月07日 12:29:42

一.泛型:

       泛型是JDK1.5中一个重要的特征。

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

         因为泛型的引入让集合类框架避免了运行时抛出的ClassCastExceptions,当编译时不出错,则运行时就不会出错。所以java的大部分类库都已经泛型化了。

         java泛型的主要目的是建立具有类型安全的数据结构,在使用泛型类建立的数据结构时,不必进行强制类型转换。

         简单实现:

 

        

public class GenericTest<T> {
        private T  generic;

	public T getGeneric() {
		return generic;
	}

	public void setGeneric(T generic) {
		this.generic = generic;
	}
	public static void main(String[] args) {
		
		GenericTest<String>  generic  =  new  GenericTest<String>();
		
		generic.setGeneric(new String("A"));
		
		System.out.println(generic.getGeneric());
	}
}
打印  
     A

       此例中的类后尖括号中T就是泛型,它就可以变量类型的参数化。 当GenericTest<String>  generic  =  new  GenericTest<String>()中的尖括号中声明了String类型,set进对象时只能是String类型。当传入别的类型对象时则会编译出错。

     例子:

  

 

    我们让泛型为String类型,再传入其他类型则会报错。

 

 

      其中的T可以被替换成任何一个合理的标示符,泛型的声明方式:class  类名<泛型列表>。泛型可以是任何对象和接口,但不能是基本数据类型。当使用泛型类声明对象时,必须指定类中使用的泛型的具体实际类型,也就是如GenericTest<String>  generic  =  new  GenericTest<String>()。

   


         之前我们讲过的集合类框架,他们都必须有泛型,因为没有用泛型,所以需要向下类型转换,而且其中的类型安全不能得到保证,对于一个集合中的类型,都应该是同一种类型,而不是既有字符串,又有整型,这样非常的不规范。

        所以正确的使用集合应该是这样(前面先讲集合类好理解,再学习泛型比较容易):

  先从ArrayList开始:

ArrayList:

public class ArrayListTest {
   
	public static void main(String[] args) {
	
	      List<String> array = new ArrayList<String>();
	      
	      
	      array.add(new String("Ane"));
	      array.add(new String("Two"));
	      array.add(new String("Three"));
	     
	      // 如果在往集合中添加其他类型就会编译报错.  
	      // array.add(new Integer(1));这样就会报错
	      
	      Iterator<String> i = array.iterator();
	      while(i.hasNext()){
	    	  
	    	  System.out.println(i.next());
	    	  
	      }
	   
	   
     }
}
Ane
Two
Three

 

LinkedList:

public static void main(String[] args) {
	
	      List<String>   array = new LinkedList<String>();
	      
	      
	      array.add(new String("Ane"));
	      array.add(new String("Two"));
	      array.add(new String("Three"));
	     
	      // 如果在往集合中添加其他类型就会编译报错.  
	      // array.add(new Integer(1));这样就会报错
	      
	      Iterator<String> i = array.iterator();
	      while(i.hasNext()){
	    	  
	    	  System.out.println(i.next());
	    	  
	      }
	   
	   
     }
}
Ane
Two
Three


HashSet:

public class ArrayListTest {
   
	public static void main(String[] args) {
	
	      Set<String> set=  new HashSet<String>();
	      
	      set.add("A");
	      set.add("B");
	      set.add("C");
	      
	      Iterator<String> i = set.iterator();
	      while(i.hasNext()){
	    	  
	    	  System.out.println(i.next());
	    	  
	      }
	   
	   
     }
}
A
B
C

 

当泛型列表为:class 类名<T,E>时,与前面理解还是一样的。

HashMap:

public class Test {
		public static void main(String[] args) {
	         
			 HashMap<String,Integer>  map = new HashMap<String,Integer>();
			 map.put("1",1);
			 map.put("2",2);
			 map.put("3",3);
			 map.put("4",4);
			 
			 Iterator<Map.Entry<String,Integer>> iter = map.entrySet().iterator();//返回enter
			 
			 while(iter.hasNext()){
				 Map.Entry<String,Integer> entry= (Map.Entry<String,Integer>)iter.next();
				 String key = entry.getKey();
				 int value = entry.getValue();
				 
				 System.out.println(key+":"+value);
			 }
		}
}
打印:
3:3
2:2
1:1
4:4

 

创建类时指定泛型接口以下类别:

 

public class Test<T extends List> { //指定只能为List的子类
	private T foo;
    
	public T getFoo() {
		
		return foo;
    	
	}
	public void setFoo(T foo) {
		
		this.foo = foo;
	
	}
	public static void main(String[] args) {
	    
		Test<ArrayList<String>> arr = new Test<ArrayList<String>>();//只可以以List的子类当泛型
		
		//Test<HashSet> set = new Test<HashSet>();因为HashSet不是List的子类,所以会出错误。
			
			 
	}
}




在声明一个引用时指定该引用可以使用什么的类型:

 

public class Test<T> { 
	private T foo;
    
	public T getFoo() {
		
		return foo;
    	
	}
	public void setFoo(T foo) {
		
		this.foo = foo;
	
	}
	public static void main(String[] args) {
	    
			Test<? extends List> arr = null;//在声明引用时可以指定该引用使用什么类型,但必须是其子类型
			arr = new Test<ArrayList<String>>();
			arr = new Test<LinkedList<String>>();
			 
	}
}

<? super List> 这就是指定其List的上的父类。

上面这种通配符使用注意 :

     1.实例化持有者时,它必须是实现List的类别或其子类别。

     2.当使用<?>或者<? extends SomeClass>的声明方式,意味着你只能通过该名称来取得所参考的实例信息,或者是移除某些信息,但不能增加它的信息,因为你只是知道其中放置的是SomeClass的子类,但你不知道是什么类,所以编译起不让你添加信息。如果可以放入信息,那么您就得记住放入时方的是什么类型,取出时要强制转换,这就失去了泛型的意义。

     3.<?> 等价于 <? extends Object>

例:

从图上就可以看出其中T未指定什么类型。所以不能进行修改其中的内容。

 



 

 

         

 

Java 泛型的好处及实现原理

做笔试模拟题遇到这样一个问题,平时常用泛型,好处也差不多知道,但是让写出来就不大写的出来了,所以在这边整理一下,以后也可以回顾回顾首先先总结一下好处: 简单易用 消除强制类型转换 保证类型安全...
  • u012760183
  • u012760183
  • 2016年08月02日 11:29
  • 5127

Java中的泛型<T>类与方法

泛型就是变量类型的参数化。在使用泛型前,存入集合中的元素可以是任何类型的,当从集合中取出时,所有的元素都是Object类型,需要进行向下的强制类型转换,转换到特定的类型。而强制类型转换容易引起运行时错...
  • songkai320
  • songkai320
  • 2016年07月04日 17:52
  • 28789

Java -- 泛型类型的继承规则(四)

Java -- 泛型类型的继承规则(四) 使用泛型类时,我们有必要连接一些泛型类之间有关继承和子类型的准则。先看要使用的代码示例:class Basic { public void f() {...
  • csdn_of_coder
  • csdn_of_coder
  • 2016年09月17日 17:16
  • 2314

Java基础-16总结List的子类,ArrayList,Vector,LinkedList,泛型,增强for循环,静态导入,可变参数

你需要的是什么,直接评论留言。 获取更多资源加微信公众号“Java帮帮” (是公众号,不是微信好友哦) 还有“Java帮帮”今日头条号,技术文章与新闻,每日更新,欢迎阅读 学习交...
  • s1547823103
  • s1547823103
  • 2017年02月10日 17:03
  • 378

黑马程序员——学习笔记16.Java泛型

----------------------ASP.Net+Android+IOS开发、.Net培训、期待与您交流! ----------------------     泛型(Generic) 基...
  • u011924083
  • u011924083
  • 2014年01月10日 23:44
  • 333

JAVA基础--db16_java泛型_map集合

Map集合:是和Collection并列的 常用方法: Keyset图解 因为key是唯一的,set也是唯一的,所以用set集。Key相当于一个丈夫 Ent...
  • db2625
  • db2625
  • 2015年10月01日 18:32
  • 192

Day16 --集合框架 ArrayList LinkedList 泛型 其他有关集合的

a.     代码实现          1)集合框架(去除ArrayList中重复字符串元素方式)              * 分析:                 * 1) 创建新集合...
  • zhangjian_GitHub
  • zhangjian_GitHub
  • 2017年12月22日 00:09
  • 32

16 API-集合(List的子类(ArrayList_Vector_LinkedList,集合嵌套遍历),JDK5新特性(泛型,增强for循环,静态导入,可变参数)

16 API-集合(List的子类(ArrayList_Vector_LinkedList,集合嵌套遍历),JDK5新特性(泛型,增强for循环,静态导入,可变参数)...
  • opopopwqwqwq
  • opopopwqwqwq
  • 2016年03月21日 00:55
  • 1099

c++primer第十六章模板和泛型编程小结-16

第十六章---模板和泛型编程 1、泛型编程:以独立于任何特定类型的方式编写代码。使用泛型程序时,我们需要提供具体程序实例所操作的类型或值。标准库的容 器、迭代器和算法都是泛型编程的例子。每种容器(...
  • jx232515
  • jx232515
  • 2016年11月07日 10:17
  • 129

C#成神之路<16> C#泛型

1、泛型的概念 对于泛型的概念通过程序进行讲解。 最快的一般用途的排序算法之一是Quicksort,这个算法利用分治法划分数据,然后递归调用自身来执行排序任务。 实现quickSort算法的代码...
  • memories_sunset
  • memories_sunset
  • 2016年02月09日 17:06
  • 140
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:java(16) - 泛型
举报原因:
原因补充:

(最多只允许输入30个字)