jdk1.5泛型详细介绍

泛型是JDK1.5的新特性

 

1.泛型类

没有泛型之前,一个类的属性有的地方是Integer,有的地方需要是String,这时为了写一个通用的类,我们设置一个类的属性为Object,虽然满足了我们的要求,但是它的属性什么类型都可以设置,因此会产生不安全性。

 

public class Info {
	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;
	}
}

 

 在调用这个类时

 

Info i = new Info();
i.setX(11);
i.setY("helllo");		
Integer x = (Integer) i.getX();//需要向下转换类型
String y = (String) i.getY();		
System.out.println(x+":"+y);

 

 而且,当我们上面代码换成

 

Info i = new Info();
i.setX(11);
i.setY("helllo");
		
Integer x = (Integer) i.getX();
Integer y = (Integer) i.getY();
		
System.out.println(x+":"+y);

 

 eclipse是不会报错的,但是运行时就会出现类型转换错误,他无法把“helllo”这个字符串转换成Integer。泛型的出现解决了这个问题。

 

泛型类的写法很简单,只要在类名后跟<T>就行,T可以写成其他字母,T表示type,属性的类型设置为T,由外部决定。调用这个泛型类时,需要指定T的具体类型

 

package com.luo;
public class Demo<T> {
	private T x;
	private T 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;
	}
}

 

 泛型的调用:

 

Demo<Integer> demo = new Demo<Integer>();
demo.setX(12);
demo.setY(14);

 

 这样demo的属性只能设置为Integer类型

 

泛型类也可以public class Demo<T,D>{}这样写

构造方法也可以这样写

 

public Demo(T x,T y){
	this.x = x;
	this.y=  y;
}

 

 泛型的擦除

Demo d = new Demo();表示泛型的擦除,他将按照Object类型来执行程序,也可以

Demo<Object> d = new Demo<Object>();但是上面的写法有些多余,因此产生了通配符

 

2.通配符?

 

在一个方法中,参数我希望传递一个Demo泛型对象,我希望这个泛型既可以是Demo<Integer>也可以是Demo<String>,这时我可以简单的使用Demo 就可,不带<>,但是eclipse会报黄线;然而即使用Demo<Object>它都会报错的,于是我们使用Demo<?>来表示

 

public static void main(String[] args) {
	Demo<Integer> d1 = new Demo<Integer>();
	Demo<String> d2 = new Demo<String>();
		
	fun(d1);
	fun(d2);
}
	
public static void fun(Demo<?> d){}
 

 

 

2.1泛型上限 “? extends 类” 和泛型下限 “? super 类”

 

泛型上限表示能接收的具体类只能是extends的类的子类和该类本身

 

 

public class Demo2<T extends Number> {

}
 

 

 

Demo2<Integer> dd = new Demo2<Integer>();//正确
Demo2<String> dd = new Demo2<String>();//出错的
 

 

泛型上限也可以在方法上使用

 

 

public static void fun(Demo<? extends Number> d){}
 

 

那么:

 

Demo<Integer> d1 = new Demo<Integer>();
Demo<String> d2 = new Demo<String>();
fun(d1);//正确
fun(d2);//错误
 

 

 

 

 

2、泛型方法

 

泛型方法所在类不一定是泛型类,格式为:

 

public class Info {
public <T>T test(T param){
		return param;
	}
}

 <T>T 就相当于String或者void,传入的参数一般也设置为T类型的

 

	public <T>T test(String param){ //否则这样的有什么意义?
		return (T) param;
	}
 

 

泛型方法也可以返回一个泛型数组

 

public <T>T[] print(T ...params){
	return params;
}
 

 

 

 

public static void main(String[] args) {
	Info i = new Info();
	Integer[] ss1 = i.print(new Integer[]{1,2,3,4});
	Integer[] ss2 = i.print(1,2,3,4);//要学习这种写法
}
public <T>T[] print(T ...param){
	return param;
}
 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值