知识大全 java泛型编程
Posted 类型
篇首语:人生难得几回搏,此时不搏待何时。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 java泛型编程相关的知识,希望对你有一定的参考价值。
JDK 令我们期待很久 可是当他发布的时候却更换版本号为 这说明Java已经有大幅度的变化 本文将讲解JDK 支持的新功能 Java的泛型
Java泛型
其实Java的泛型就是创建一个用类型作为参数的类 就象我们写类的方法一样 方法是这样的method(String str String str ) 方法中参数str str 的值是可变的 而泛型也是一样的 这样写class Java_Generics<K V> 这里边的K和V就象方法中的参数str 和str 也是可变 下面看看例子 //code list import Java util Hashtable;class TestGen <K V> public Hashtable<K V> h=new Hashtable<K V>(); public void put(K k V v) h put(k v); public V get(K k) return h get(k); public static void main(String args[]) TestGen <String String> t=new TestGen <String String>(); t put( key value ); String s=t get( key ); System out println(s);
正确输出:value
这只是个例子(Java中集合框架都泛型化了 这里费了 遍事 ) 不过看看是不是创建一个用类型作为参数的类 参数是K V 传入的 值 是String类型 这个类他没有特定的待处理型别 以前我们定义好了一个类 在输入输入参数有所固定 是什么型别的有要求 但是现在编写程序 完全可以不制定参数的类型 具体用的时候来确定 增加了程序的通用性 像是一个模板
呵呵 类似C++的模板(类似)
泛型通配符
下面我们先看看这些程序
//Code list void TestGen Medthod (List l) for (Object o : l) System out println(o);
看看这个方法有没有异议 这个方法会通过编译的 假如你传入String 就是这样List<String>
接着我们调用它 问题就出现了 我们将一个List<String>当作List传给了方法 JVM会给我们一个警告 说这个破坏了类型安全 因为从List中返回的都是Object类型的 而让我们再看看下面的方法
//Code list void TestGen Medthod (List<String> l) for (Object o : l) System out println(o);
因为这里的List<String>不是List<Object>的子类 不是String与Object的关系 就是说List<String>不隶属于list<Object> 他们不是继承关系 所以是不行的 这里的extends是表示限制的
类型通配符是很神奇的 List<?>这个你能为他做什么呢?怎么都是 ? 它似乎不确定 他总不能返回一个?作为类型的数据吧 是啊他是不会返回一个 ? 来问程序员的?JVM会做简单的思考的 看看代码吧 更直观些
//code list List<String> l = new ArrayList<String>();li add( String );List<?> l = l ;System out println(l get( ));
这段代码没问题的 l get( )将返回一个Object
编写泛型类要注意
) 在定义一个泛型类的时候 在 <> 之间定义形式类型参数 例如 class TestGen<K V> 其中 K V 不代表值 而是表示类型
) 实例化泛型对象的时候 一定要在类名后面指定类型参数的值(类型) 一共要有两次书写 例如
TestGen<String String> t=new TestGen<String String>()
) 泛型中<K extends Object> extends并不代表继承 它是类型范围限制 泛型与数据类型转换
消除类型转换
上面的例子大家看到什么了 数据类型转换的代码不见了 在以前我们经常要书写以下代码 如 //code list import Java util Hashtable;class Test public static void main(String[] args) Hashtable h = new Hashtable(); h put( key value ); String s = (String)h get( key ); System out println(s);
这个我们做了类型转换 是不是感觉很烦的 并且强制类型转换会带来潜在的危险 系统可能会抛一个ClassCastException异常信息 在JDK 中我们完全可以这么做 如 //code list import Java util Hashtable;class Test public static void main(String[] args) Hashtable<String Integer> h = new Hashtable<String Integer> (); h put( key new Integer( )); int s = h get( key ) intValue(); System out println(s);
这里我们使用泛化版本的HashMap 这样就不用我们来编写类型转换的代码了 类型转换的过程交给编译器来处理 是不是很方便 而且很安全 上面是String映射到String 也可以将Integer映射为String 只要写成HashTable<Integer String> h=new HashTable<Integer String>();h get(new Integer( ))返回value 果然很方便
自动解包装与自动包装的功能
从上面有没有看到有点别扭啊 h get(new Integer( ))这里的new Integer( );好烦的 在JDK 之前我们只能忍着了 现在这种问题已经解决了 请看下面这个方法 我们传入一个int这一基本型别 然后再将i的值直接添加到List中 其实List是不能储存基本型别的 List中应该存储对象 这里编译器将int包装成Integer 然后添加到List中去 接着我们用List get( );来检索数据 并返回对象再将对象解包装成int 恩 JDK 给我们带来更多方便与安全 //Code list public void autoBoxingUnboxing(int i) ArrayList<Integer> L= new ArrayList<Integer>(); L add(i); int a = L get( ); System out println( The value of i is + a);
限制泛型中类型参数的范围
也许你已经发现在code list 中的TestGen<K V>这个泛型类 其中K V可以是任意的型别 也许你有时候呢想限定一下K和V当然范围 怎么做呢?看看如下的代码 //Code list class TestGen <K extents String V extends Number> private V v=null; private K k=null; public void setV(V v) this v=v; public V getV() return this v; public void setK(K k) this k=k; public V getK() return this k; public static void main(String[] args) TestGen <String Integer> t =new TestGen <String Integer>(); t setK(new String( String )); t setV(new Integer( )); System out println(t getK()); System out println(t getV());
上边K的范围是<=String V的范围是<=Number 注意是 <= 对于K可以是String的 V当然也可以是Number 也可以是Integer Float Double Byte等 看看下图也许能直观些请看上图A是上图类中的基类 A A 分别是A的子类 A 有 个子类分别是A _ A _
然后我们定义一个受限的泛型类class MyGen<E extends A > 这个泛型的范围就是上图中兰色部分
这个是单一的限制 你也可以对型别多重限制 如下
class C<T extends Comparable<? super T> & Serializable>
我们来分析以下这句 T extends Comparable这个是对上限的限制 Comparable< super T>这个是下限的限制 Serializable是第 个上限 一个指定的类型参数可以具有一个或多个上限 具有多重限制的类型参数可以用于访问它的每个限制的方法和域
cha138/Article/program/Java/hx/201311/27017相关参考
Java高级编程——泛型类型第一部分 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 编辑按《Ja
Java编程思想里的泛型实现一个堆栈类分享 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 觉得作
PureC++:泛型编程:模板特殊化 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 在上一期专栏
C#泛型编程基础知识总结 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 在项目中通过对项目不断更
Java的泛型原来这样让人不舒服 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! Java泛型中的
轻松掌握Java泛型(第1部分) 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! JSE-代号为T
泛型是在jdk之后才出现的一种机制说简单点就是一个特定的对象可以接收任何的对象例如杯子可以装水也可以装饮料说简单点就是来者不拒什么都要下面我就来写个小例子看一下 写一个接口Info里面什么方法都
知识大全 Java5泛型 T.class的获取和为擦拭法站台
Java5泛型T.class的获取和为擦拭法站台 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
Java学习笔记:泛型(一) 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 一为什么需要泛型&n
知识大全 Java网络编程-Java Socket编程(五)
Java网络编程-JavaSocket编程(五) 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!