黑马程序员_Java_泛型(Generic)
来源:互联网 发布:linux内核启动流程 编辑:程序博客网 时间:2024/05/01 13:27
-------------------------ASP.Net+Unity开发、.Net培训、期待与您交流!--------------------------
java5.0新特性泛型将运行时期出现的问题ClassCastException转移到了编译时期,
方便于程序员解决问题,让运行期间问题减少,安全性提高且避免了强制转换的麻烦。泛型通常在集合框架中很常见,用来限定集合中元素的类型:
如 ArrayList<String> al = new ArrayList<String>();
表示集合al中只能存放String类型的元素。
泛型是给编译器看的,通过反射可以绕过编译器对泛型的检查。
当类中要操作的引用数据类型不确定的时候,早期定义Object来完成扩展,现在定义泛型来完成。
class Utils<T>{ private T q; public void setObject(T q) { this.q = q; } public T getObject() { return q; }}public class GenericTest{ public static void main(String[] args) { Utils<Person> ul = new Utils<Person>(); ul.setObject(new Person("ha", 20)); Person p = ul.getObject(); System.out.println(p); }}
为了让不同方法可以操作不同类型,而且类型还不确定,可以将泛型定义在方法上,
只有引用类型才能作为泛型方法的实际参数,
静态方法不可以访问类上定义的泛型,如果静态方法类型不确定,可以将泛型定义在方法上。
Class Demo<T>{ public void show(T t) { System.out.println("show:"+t); } public <Q> void print(Q q) { System.out.println("print:"+q); } public static <W> void method(W t) { System.out.println("method:"+t); } }
泛型可定义在接口上:
interface Inter<T>{ void show(T t);}class InterImpl<T> implements Inter<T>{ public void show(T t) { System.out.println("show :"+t); }}
泛型的限定:用于泛型扩展
?表示通配符
? extends E:可以接受E类型或者E的子类型,上限。
? super E:可以接受E类型或者E的父类型,下限。
如方法public static void print(Collection<? extends Person> al)
可以打印Person或者是Person类的子类
参数化类型不考虑类型参数的继承关系:
Vector<String> v = new Vector<Object>();//错误
Vector<Object> v = new Vector<String>();//错误
如下方法这样写:
public static void printCollection(Collection<?> collection),
则在方法体中collection不能调用与参数化类型有关的方法
public static void printCollection(Collection<?> collection) { System.out.println(collection.size()); for (Object obj : collection) { System.out.println(obj); }}
类型推断:
private static <T> T add(T x, T y) { return null; } add(3, 5); Number x1 = add(3.5, 3);//x1类型取Float和Integer的交集 Object x2 = add(3, "abc");//x2取Integer和String的交集
下面例子交换任意数组指定位置的元素
private static <T> void swap(T[] a, int i, int j) { T tmp = a[i]; a[i] = a[j]; a[j] = tmp; }String[] str = new String[] { "abc", "xyz", "ccc" };swap(str, 1, 2);
异常泛型举例:
private static <T extends Exception> void run() throws T{ try{} catch (Exception e) { throw (T) e; }}
下面方法将obj对象转换为任意对象:
private static <T> T autoConvert(Object obj) { return (T) obj; } Object obj = "abc"; String str = autoConvert(obj);
下面方法用任意对象填充任意数组a:
private static <T> void fillArray(T[] a, T obj) { for (int i = 0; i < a.length; i++) { a[i] = obj; } System.out.println(Arrays.toString(a)); }String[] str = new String[] { "abc", "xyz", "ccc" };fillArray(str, "ddd"),则数组str中的元素都变成了"ddd".
下面程序将一个数组中的内容拷贝到另一个数组:
public class Generic2<T>{ private T[] fooArray; public T[] getFooArray() { return fooArray; } public void setFooArray(T[] fooArray) { this.fooArray = fooArray; }
public static void main(String[] args) { Generic2<String> foo = new Generic2<String>(); String[] str1 = { "hello", "world", "welcome" }; String[] str2 = null; foo.setFooArray(str1); str2 = foo.getFooArray(); for (int i = 0; i < str2.length; i++) { System.out.println(str2[i]); } }}
好了,对泛型的学习就总结到这了,谢谢。
--------------------------ASP.Net+Unity开发、 .Net培训、期待与您交流!-----------------------
详情请查看:http://edu.csdn.net
- 黑马程序员_Java_泛型(Generic)
- 黑马程序员_Java_泛型
- 黑马程序员_Java_泛型
- 黑马程序员-泛型Generic
- 黑马程序员:Generic泛型
- 黑马程序员_java_异常&泛型
- 黑马程序员_泛型(Generic)
- 黑马程序员----泛型(Generic)
- 黑马程序员_Java_高新技术——泛型
- 黑马程序员_java_集合框架_Collection_List_Set_Map_泛型
- 黑马程序员_java_集合框架_Collection_List_Set_泛型
- 黑马程序员_Java_数据类型
- 黑马程序员_Java_反射
- 黑马程序员_JAVA_基础
- 黑马程序员_JAVA_异常
- 黑马程序员_JAVA_多线程
- 黑马程序员_JAVA_字符串
- 黑马程序员_JAVA_反射
- 黑马程序员_Java面向对象4
- SDL游戏之路(二十一)--声音
- 团队需要哪些培训
- 动态规划3:最大子段和问题到最大子矩阵问题(三):初探最大子矩阵之和问题
- Nginx CORS实现JS跨域
- 黑马程序员_Java_泛型(Generic)
- 11g的exp导出空表提示EXP-00011: SCOTT.TEST1 不存在
- UVA 10917 Walk Through the Forest SPFA
- 1258-Agri-net
- dede:channel 分页 & JS分页
- XP批处理导入数字签名和对应用程序签名
- 将树莓派Raspberry Pi设置为无线路由器(WiFi热点AP,RTL8188CUS芯片)2
- 黑马程序员_Java_枚举(enum)
- SVG画多种不同的图形