JDK5.0新特性(1)-泛型(Generic)

简介:

1) 一句话总结泛型的和核心。

就是类装载类型的参数化。类型是:比如ArrayList<E> , E已经参数化了。E已经是ArrayList中的一部分了,所以当

ArrayList<Boolean> list1 = new ArrayList<Boolean>();

ArrayList<Integer> list2 = new ArrayList<Integer>();

list1=list2 ;

//会出现编译错误,因为Boolean 和 Integer已经是ArrayList中的一部分了。作用是不需要进行强制类型转换。

2)相关语法:

  • 可以加多个类型参数,用逗号隔开。比如 Generic<T,E>
  • 不能创建一个泛型数组。比如 T[] objectArr = new T[10] ; 语法上是不允许的。解决方式是new一个Object数组然后强行转换为T数组:T[] objectArr=(T[])new Object[10];
  • 当然T也可以是一个泛型,比如 ArrayList<E> E可以代表一个自己定义的泛型比如 Generic<T> 。所以叫做泛型中包括泛型。
  • JDK1.5中所有的集合类都重写为泛型了。

 

3)限制泛型中的引用类型。

定义泛型的类别是,默认情况下可以使用任何类来定义泛型中的类型。如ArrayList<T>,T可以是任何类型。当然也可以限制T类型,使用extends关键字来制这个类的装载类型。

实例化泛型的引用类别时(就是这个引用能够引用什么类别时),可以使用 ? 比如要实现下面的需求让ge1=ge2,

Generic<? extends List> ge1; Generic<? extends List> ge2 ;

ge1= new Generic<ArrayList>();

ge2=new Generic<LinkedList>();

这时候就可以使 ge1=ge2; 同时可以使用 <? super List> 表示List上面的类。

注意:在使用<?>或者<? extends Object>时这两个相同,意味着该引用只能通过赋值的方式(增加)或者通过删除的方式ge.set(null);但不能增加它的信息 比如ge.set(new ArrayList<String>()); 因为违反了泛型的初衷。

上面的总结可能比较含糊,看看代码和代码的注释就明白了。

 
 
  1. import java.util.ArrayList;  
  2. import java.util.LinkedList;  
  3. import java.util.List;  
  4.    
  5. public class TestGeneric<t> {  
  6.     private  T  foo ;   
  7.    
  8.     public T getFoo() {  
  9.         return foo;  
  10.     }  
  11.    
  12.     public void setFoo(T foo) {  
  13.         this.foo = foo;  
  14.     }  
  15.    
  16.     public static  void main(String... args){  
  17.    
  18. //       在类声明时上面的T表示这个类可以装载什么类型  如果类名改变为 TestGeneric<t extends="" list=""> 
  19. //      说明只能装载List的子类别   
  20.    
  21. //      而TestGeneric<?> 则表明了 这个类的引用可以指向什么样的类型,看下面的例子  
  22. //      如果是这样的话就会报错,因为ge只能指向 TestGeneric<ArrayList>()  
  23. //      TestGeneric<ArrayList> ge=  new TestGeneric<ArrayList>();  
  24. //      ge = new TestGeneric<LinkedList>();  
  25.    
  26.         //但是如果这样ge就可以指向TestGeneric<ArrayList> 和TestGeneric<LinkedList>和  
  27.         //TestGeneric<Object>(); 以及任何Object的子类  
  28.         TestGeneric<?> genew TestGeneric<arraylist>();  
  29.         genew TestGeneric  
  30. <linkedlist>();  
  31.         ge = new TestGeneric<object>();  
  32.    
  33.         //但是如果只想指向实现了List接口的类,可以使用 <? extends List> 
  34.         TestGeneric<? extends List> ge1new TestGeneric<ArrayList>();  
  35.         ge1 =  new TestGeneric<LinkedList>();  
  36. //      ge1 =  new TestGeneric<Object>();   会报错  
  37.    
  38. //      同时还可以指定引用的父类,说明ge2只能指向TestGeneric所装载的类的List的上层类别  
  39.         TestGeneric<? super List> ge2 = new TestGeneric<Object>();  
  40.    
  41.         //关于赋值  
  42.         TestGeneric<String>  ge3 = new TestGeneric<String>();  
  43.         ge3.setFoo("Hello World.....");  
  44.    
  45.         TestGeneric<?>  ge4 = new TestGeneric<string>();  
  46.         ge4=ge3;  
  47.         ge3.getFoo();  //是正确的  
  48. //      ge4.setFoo("String");  但是set就会编译错误,因为ge4.set(?) 是一个问号类型,这样当  
  49. //      get的时候就会不知道其明确的类型,这违反了 泛型的初衷  
  50.    
  51.     }  
  52. }  
  53. </string></object></linkedlist></arraylist></t></t> 

 


本文转自 最牛傻蛋 51CTO博客,原文链接:http://blog.51cto.com/zuiniuwang/719911,如需转载请自行联系原作者

相关文章
|
2月前
|
容器
jdk8新特性-详情查看文档
jdk8新特性-详情查看文档
46 3
|
1月前
|
存储 安全 Java
JDK1.8 新的特性
JDK1.8 新的特性
21 0
|
2月前
|
编解码 安全 Java
jdk8新特性-接口和日期处理
jdk8新特性-接口和日期处理
|
3月前
|
Java API
JDK8到JDK25版本升级的新特性问题之使用Collectors.teeing()来计算一个列表中学生的平均分和总分如何操作
JDK8到JDK25版本升级的新特性问题之使用Collectors.teeing()来计算一个列表中学生的平均分和总分如何操作
|
3月前
|
Java API Apache
JDK8到JDK24版本升级的新特性问题之在Java中,HttpURLConnection有什么局限性,如何解决
JDK8到JDK24版本升级的新特性问题之在Java中,HttpURLConnection有什么局限性,如何解决
|
3月前
|
Oracle Java 关系型数据库
JDK8到JDK29版本升级的新特性问题之未来JDK的升级是否会成为必然趋势,如何理解
JDK8到JDK29版本升级的新特性问题之未来JDK的升级是否会成为必然趋势,如何理解
|
3月前
|
Oracle 安全 Java
JDK8到JDK28版本升级的新特性问题之在Java 15及以后的版本中,密封类和密封接口是怎么工作的
JDK8到JDK28版本升级的新特性问题之在Java 15及以后的版本中,密封类和密封接口是怎么工作的
|
3月前
|
Java API 开发者
JDK8到JDK17版本升级的新特性问题之SpringBoot选择JDK17作为最小支持的Java lts版本意味着什么
JDK8到JDK17版本升级的新特性问题之SpringBoot选择JDK17作为最小支持的Java lts版本意味着什么
132 0
JDK8到JDK17版本升级的新特性问题之SpringBoot选择JDK17作为最小支持的Java lts版本意味着什么
|
2月前
|
Java 编译器 API
JDK8新特性--lambda表达式
JDK8的Lambda表达式是Java语言的一大进步。它为Java程序提供了更多的编程方式,让代码更加简洁,也让函数式编程的概念在Java中得到了体现。Lambda表达式与Java 8的其他新特性,如Stream API、新的日期时间API一起,极大地提高了Java编程的效率和乐趣。随着时间的流逝,Java开发者对这些特性的理解和应用将会越来越深入,进一步推动Java语言和应用程序的发展。
15 0
|
3月前
|
算法 Java iOS开发
JDK8到JDK27版本升级的新特性问题之JDK 17中G1在资源占用方面有何变化
JDK8到JDK27版本升级的新特性问题之JDK 17中G1在资源占用方面有何变化