jdk新特性之泛型
2015-10-22 20:07
399 查看
泛型
这里举一个简单的例子来说明泛型出现的意义
假设我们需要输出一个坐标,预设为Point类,为了使得可以返回多种类型的数标,我们进行向上转型
在主类中我们可以传入不同的类型,比如Integer类型
或者String类型
但这种实现方法有一个编译中无法侦测到的异常隐患
很明显,尽管编译中这里没有提示错误,但Y坐标的设置set与get方法无法匹配类型,于是引入泛型。
此时,在获取坐标时不再进行向下转型,而当类型不匹配时将会编译报错。
泛型中的通配符“ ?”
泛型的出现解决了数据类型的统一问题,且避免了向下转型,但又带来了新的问题,即泛型类的实例化对象向方法中传输时无法重载的问题
在主类中进行实例化,
Message<String>msg=new Message<String>();
msg.setInfo("hello world");
当我们传入此实例化对象时,则应写为public static void print(Message<String>temp),那么问题来了,如果我们同时需要再向print方法中传入一个Message对象时(比如Message<Integer>temp),怎么做呢?重载是不可行的,来自于同一个类的不同对象是一致处理的,此时借助通配符。
public static void print(Message<?>temp)
此外,<? extends>与<? super>分别设置T这个类的上下限,详细请自行百度
这里举一个简单的例子来说明泛型出现的意义
假设我们需要输出一个坐标,预设为Point类,为了使得可以返回多种类型的数标,我们进行向上转型
public class Point { // 表示坐标 private Object x; private Object y; public Object getX() { return x; } public void setX(Object x) { this.x = x; } public Object getY() { return y; } public void setY(Object y) { this.y = y; } }
在主类中我们可以传入不同的类型,比如Integer类型
public class GenDemo01 { public static void main(String[] args) { Point p = new Point(); p.setX(11); // int --> Integer --> Object p.setY(20); // int --> Integer --> Object int x = (Integer) p.getX(); // 取出x坐标 int y = (Integer) p.getY();// 取出y坐标 System.out.println("x的坐标是:" + x); System.out.println("y的坐标是:" + y); } }
或者String类型
public class GenDemo03 { public static void main(String[] args) { Point p = new Point(); p.setX("东经180度"); p.setY("北纬220度"); String x = (String) p.getX(); // 取出x坐标 String y = (String) p.getY();// 取出y坐标 System.out.println("x的坐标是:" + x); System.out.println("y的坐标是:" + y); } }
但这种实现方法有一个编译中无法侦测到的异常隐患
public class GenDemo04 { public static void main(String[] args) { Point p = new Point(); p.setX(10); p.setY("北纬220度"); int x = (Integer) p.getX(); // 取出x坐标 int y = (Integer) p.getY();// 取出y坐标 System.out.println("x的坐标是:" + x); System.out.println("y的坐标是:" + y); } }
很明显,尽管编译中这里没有提示错误,但Y坐标的设置set与get方法无法匹配类型,于是引入泛型。
public class Point<T> { // 表示坐标 private T x; // x属性的类型由外部决定 private T y; // y属性的类型由外部决定 public T getX() { return x; } public void setX(T x) { this.x = x; } public T getY() { return y; } public void setY(T y) { this.y = y; } }
public class GenDemo05 { public static void main(String[] args) { Point<Integer> p = new Point<Integer>(); p.setX(11); p.setY(20); int x = p.getX(); // 取出x坐标 int y = p.getY();// 取出y坐标 System.out.println("x的坐标是:" + x); System.out.println("y的坐标是:" + y); } }
此时,在获取坐标时不再进行向下转型,而当类型不匹配时将会编译报错。
泛型中的通配符“ ?”
泛型的出现解决了数据类型的统一问题,且避免了向下转型,但又带来了新的问题,即泛型类的实例化对象向方法中传输时无法重载的问题
class Message<T>{ private T info; Public void setLnfo(T info){ this.info=info; } Public T getLnfo(){ return info; } }
在主类中进行实例化,
Message<String>msg=new Message<String>();
msg.setInfo("hello world");
当我们传入此实例化对象时,则应写为public static void print(Message<String>temp),那么问题来了,如果我们同时需要再向print方法中传入一个Message对象时(比如Message<Integer>temp),怎么做呢?重载是不可行的,来自于同一个类的不同对象是一致处理的,此时借助通配符。
public static void print(Message<?>temp)
此外,<? extends>与<? super>分别设置T这个类的上下限,详细请自行百度
相关文章推荐
- java基础 - 搭建环境变量
- Welcome to JAVA!(第8章课后习题)
- Java学习笔记(二)——变量与常量
- Java--类加载时执行方法顺序
- 使用Spring进行切面(AOP)编程
- java 对象入门
- spring mvc中string不能转为date型解决
- Java并发之Lock的实现原理
- Java设计模式2:简单工厂模式
- 学习java的前期知识
- Mac下Android的Eclipse开发环境的搭建
- spring+mybatis多数据源切换
- 为什么Java不支持多继承?
- Java 7的并发编程-Phaser
- spring的placeholder配置
- Spark启动错误Exception in thread “main” java.lang.NoSuchMethodError: scala.collection.immutable.HashSet$
- Ubuntu14.04 安装jdk
- jdk7的新特性
- 使用Spring容器取出Bean时的奇怪的ClassCastException
- 图灵机器人(智能云交互API)的一个java实现简单例子