您的位置:首页 > 编程语言 > Java开发

jdk新特性之泛型

2015-10-22 20:07 399 查看
泛型

这里举一个简单的例子来说明泛型出现的意义

假设我们需要输出一个坐标,预设为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这个类的上下限,详细请自行百度
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: