Java 泛型
来源:互联网 发布:孤岛危机3 优化 编辑:程序博客网 时间:2024/06/03 17:14
泛型的概念
泛型:类中操作的属性或方法的参数类型不在定义时,而是在使用时动态设置.使用泛型可以很好地解决数据类型统一的问题.与使用Object相比,此时程序没有向下转型的操作关系,不存在数据的安全性问题.
泛型的使用
代码示例
class Point<T>{ private T x; private T y; public void setX(T x){ this.x = x; } public T getX(){ return this.x; } public void setY(T y){ this.y = y; } public T getY(){ return this.y; }}public class TestDemo{ public static void main(String [] args){ Point<Integer> p1 = new Point<Integer>(); Point<String> p2 = new Point<String>(); Point p3 = new Point(); p1.setX(10); p1.setY(20); p2.setX("东经10度"); p2.setY("西经20度"); p3.setX(10.0); p3.setY(20.0); System.out.print("整型坐标:"); int x1 = p1.getX(); int y1 = p1.getY(); System.out.println("X的坐标是:" + x1 + ",Y的坐标是:" + y1); System.out.print("字符型坐标:"); String x2 = p2.getX(); String y2 = p2.getY(); System.out.println("X的坐标是:" + x2 + ",Y的坐标是:" + y2); System.out.print("double型坐标:"); double x3 = (double) p3.getX(); double y3 = (double) p3.getY(); System.out.println("X的坐标是:" + p3.getX() + ",Y的坐标是:" + p3.getY()); }}
程序运行结果
整型坐标:X的坐标是:10,Y的坐标是:20
class java.lang.Integer
字符型坐标:X的坐标是:东经10度,Y的坐标是:西经20度
class java.lang.String
double型坐标:X的坐标是:10.0,Y的坐标是:20.0
通过本程序可以注意到:
1. 声明泛型对象操作
Point<String> p = new Point<String>()
如果要设置泛型类型,只能将其定义为类的形式,例如要保存int型数据,则设置的类型必须是其的包装类Integer 若没有设置泛型类型,所有的类型都统一变为Object类型,可以修改为任意的数据类型.但是在使用的时候必须要进行向下转型.
通配符
泛型的出现确实可以解决数据类型统一的问题,并且避免向下转型,但同时又会带来新的问题——给出了泛型后,将一个类划分为多个不同的小类型.如下图:
class Message<T>{ private T info; public void setInfo(T info){ this.info = info; } public T getInfo(){ return this.info; }}public class TestDemo{ public static void main(String [] args){ Message<String> msg1 = new Message<String>(); Message<Integer> msg2 = new Message<Integer>(); msg1.setInfo("Hello"); msg2.setInfo(100); print(msg1); print(msg2); } public static void print(Message<?> msg){ // 错误语法无法修改 //msg.setInfo("World"); System.out.println(msg.getInfo()); }}
程序运行结果
Hello
100
注:
通配符”?”衍生出了两个字符号:
设置泛型的上限:? extends 类,如 ? extends Number,表示只能是Number或者是Number的子类Integer等.
设置泛型的下限:? super 类,如? super String,表示只能是String或者是Stirng类的父类(Object).
泛型接口
使用泛型定义的接口成为泛型接口
定义泛型接口
interface Message<T>{ public String echo(T msg);}
在Java中有两种泛型接口的实现方式:
1. 在子类上继续定义泛型,同时此泛型在接口上继续使用
interface Message<T>{ public String echo(T msg);}class MessageImpl<T> implements Message<T>{ public String echo(T msg){ return "Echo:" + msg; }}public class TestDemo{ public static void main(String [] args){ Message<String> msg = new MessageImpl<String>(); System.out.println(msg.echo("张三")); }}
程序运行结果
Echo:张三
- 在子类上设置具体类型
interface Message<T>{ public String echo(T msg);}class MessageImpl implements Message<String>{ public String echo(String msg){ return "Echo:" + msg; }}public class TestDemo{ public static void main(String [] args){ Message<String> msg = new MessageImpl(); System.out.println(msg.echo("张三")); }}
程序运行结果
Echo:张三
泛型方法
对于泛型,除了可以定义在类上之外,也可以在方法上进行定义.泛型方法的具体类型在调用的时候来决定.
public class TestDemo{ public static void main(String [] args){ // 设置泛型类型只能定义为类的形式 Integer [] data = get(1, 2, 3); for(int i : data){ System.out.print(i + ","); } } // 泛型方法 public static <T> T [] get(T ... arg){ // 可变参数实际上是按数组方式进行操作的 return arg; }}
程序运行结果
1,2,3,
可以发现,在定义泛型方法时,还要首先定义出泛型的名称”
- 【java 2】java泛型
- Java 泛型 Java generic
- Java Tutorials_Generics(java泛型)
- Java基础 Java 泛型
- java 泛型
- java泛型
- Java泛型
- Java泛型
- java泛型
- java泛型
- java泛型
- Java 泛型
- Java泛型
- Java 泛型
- JAVA 泛型
- java 泛型
- java泛型
- Java泛型
- Java基础语法之数组
- 206. Reverse Linked List
- C#窗体程序的退出
- 震惊! 连谷歌开发人员都不知道的androd stdio使用方式 别说我没告诉你
- Dom解析XML
- Java 泛型
- 在Windows和Linux系统中的一些信息收集方法
- nginx基本配置整理
- 【Hadoop】执行start-dfs.sh出错
- 与您共读《Java 编程思想》
- 基于Linux c 用socket和线程 实现的简易聊天室之服务器
- 《cuda并行程序设计》勘误(1)
- 欢迎使用CSDN-markdown编辑器
- kinect2+orbslam学习记录一