java泛型
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java泛型,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3670字,纯文字阅读大概需要6分钟。
内容图文
![java泛型](/upload/InfoBanner/zyjiaocheng/1061/bc75997f076d44b192f41588fdf79c8c.jpg)
泛型平时用的最多的就是集合了,但是有时候看人家的代码,有自定义泛型方法,都忘了,所以再看看泛型,学习一下。
- 泛型就是参数化类型
- 适用于对多种数据类型执行相同功能的代码,泛型中的类型在使用时指定
- 泛型归根结底就是“模板”
泛型2个作用:
1,安全:存数据的时候类型检查
2,省心:取数据的时候不用类型转换
起因:JDK1.4之前类型不明确
- 装入集合的类型都被当做Object对待,从而失去自己的实际类型。
- 从集合中取数据需要类型转换,效率低,容易产生错误。
JDK1.5方案:在定义集合的同时,定义集合中对象的类型。
作用:
- 模板,提高代码的重用率。
- 安全:在编译的时候检查类型安全
- 省心:所有的自动转换都是自动的和隐式的
例子程序:
package generic; import java.util.ArrayList; import java.util.List; /** * 1,泛型:标签,泛化类型 * 2,作用:安全 省心 * @author Administrator * */ public class Test01 { public static void main(String[] args) { /** * JDK1.5之后,泛型 */ List<String> list = new ArrayList<String>(); //安全,add的时候会类型检查 list.add("牛贝"); list.add("张三"); //list.add(100);//类型检查 //省心 String ele = list.get(0); System.out.println(ele); //jdk1.5之前 List list2 = new ArrayList(); list2.add(100); list2.add("大表哥"); //取出数据 Object obj = list2.get(0); Integer num = (Integer)obj; //麻烦 //不安全 num = (Integer)list2.get(1);// java.lang.ClassCastExceptionif(list2.get(1) instanceof Integer){//需要手动类型转换 num = (Integer)list2.get(1);//才能保证安全 } } }
一,泛型类:
需求:student类,成员变量 分数 javase,可以是整形:80分,小数型:85.5分,等级:“优秀”“差”,不用泛型就得用Object:
po类:
package generic; public class Student { /** * javase成绩 * 需求: * 成绩可能是 整数、小数、成绩等级如A、B、C * 所以写成Object */ private Object javase; public Student(){ } public Student(Object javase) { super (); this.javase = javase; } public Object getJavase() { return javase; } publicvoid setJavase(Object javase) { this.javase = javase; } }
测试:
package generic; public class StudentApp { public static void main(String[] args) { Student stu = new Student(80);//存入整数 Object javase = stu.getJavase(); //类型检查 处理转换异常if(javase instanceof Integer){ Integer score = (Integer)javase;//强制类型转换 } stu = new Student("优秀"); javase = stu.getJavase(); if(javase instanceof String){ String score = (String)javase; } } }
使用泛型类:
package generic; /** * 自定义泛型类: * 1,<> -->单个字母,尽可能见名知意 * 2,T Type * K V Key Value * E Element * 3,注意泛型不能使用在静态属性上 */ // T type ,类型 public class MyStudent<T> { private T javase; // private static T test;//静态编译错误public MyStudent(){} public MyStudent(T javase) { super(); this.javase = javase; } public T getJavase() { return javase; } publicvoid setJavase(T javase) { this.javase = javase; } }
测试:
package generic; public class MyStudentApp { public static void main(String[] args) { MyStudent<Integer> stu = new MyStudent<Integer>(); //安全:类型检查 stu.setJavase(80); //省心: Integer javase = stu.getJavase(); } }
二、泛型接口
定义接口时使用泛型,注意,接口中泛型字母只能使用在方法中,不能使用在全局常量中。
package generic; /** * 泛型接口: * 泛型不能使用在全局常量上 * * @param <T> */ public interface Comparator<T> { //全局常量/*public static final*/int MAX_VALUE = 1024; //公共抽象方法/*public abstract */T compare(T t); }
三、泛型方法
可以在非泛型类中定义,在返回类型前加 <字母>
package generic; import java.io.Closeable; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.util.ArrayList; import java.util.List; /** * 非泛型类定义泛型方法 * 定义:在返回类型前加 <字母> * @author Administrator * */ public class Method { // 泛型方法 public static <T> void test(T t){ System.out.println(t); } //泛型继承一个接口publicstatic <T extends List> void test(T t){ t.add("123"); t.add(456); System.out.println(t.get(0)); } /** * Closeable接口,有close()方法,释放资源 * @param a 可变参数,类似数组用法 */publicstatic <T extends Closeable> void test(T... a){ for (T temp : a) { if(temp != null){ try { temp.close(); } catch (IOException e) { e.printStackTrace(); } } } } publicstaticvoid main(String[] args) throws FileNotFoundException { test("我是泛型方法"); List list = new ArrayList<>(); list.add("我是有继承泛型方法啊!"); test(list); test(new FileInputStream("a.txt")); } }
原文:http://www.cnblogs.com/lihaoyang/p/7103277.html
内容总结
以上是互联网集市为您收集整理的java泛型全部内容,希望文章能够帮你解决java泛型所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。