黑马程序员——Java 泛型



泛型

------<a href="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! -------


JDK1.5版本以后出现新特性。用于解决安全问题,是一个类型安全机制。

 

好处

1.将运行时期出现 类型转换异常ClassCastException,转移到了编译时期。方便于程序员解决问题。让运行时问题减少,安全。

2.避免了强制转换麻烦。

格式

通过<>来定义要操作的引用数据类型。

什么时候写泛型呢

通常在集合框架中很常见,只要见到<>就要定义泛型。<> 就是用来接收类型的。

 在使用集合时,将集合中要存储的数据类型作为参数传递到<>中即可。


泛型类

什么时候定义泛型类?

当类中要操作的引用数据类型不确定的时候,早期定义Object来完成扩展。现在定义泛型来完成扩展。

//创建泛型类
class FanXing<FX>
{
	Private FX f;
	public void setObject(FX f)
	{
		this.f= f;
	}
	public FX getObject()
	{
		return f;
	}
}
//后期建立的对象类
class Student
{
}
//将要操作的数据类型作为参数传递到<>中
class Demo
{
	public static void main(String[] args) 
	{
		FanXing<Student> fx = new FanXing<Student>();

		fx.setObject(new Student());
		Student stu = fx.getObject();;//无需强转操作
	}
}

泛型类定义的泛型作用于整个类中。如果要使用方法,泛型类的对象一明确要操作的具体类型后,所有方法操作的类型也就固定了。

 

泛型方法

为了让不同方法可以操作不同类型,而且类型还不确定。那么可以将泛型定义在方法上。

 

//泛型方法
class Demo
{
	Public <T> void show(T t)
	{
		System.out.println("show:"+t);
	}
	public <Q> void print(Q q)
	{
		System.out.println("print:"+q);
	}
}

静态方法泛型

特殊之处:

静态方法不可以访问类上定义的泛型。

如果静态方法操作的应用数据类型不确定,可以将泛型定义在方法上。

 

//泛型类与泛型方法,静态方法泛型
class Demo<T>
{
	public void show(T t)//与泛型类一致
	{
		System.out.println("show:"+t);
	}
	public <Q> void print(Q q)
	{
		System.out.println("print:"+q);
	}
	public static <W> void method(W w)//优先于对象存在
	{
		System.out.println("method:"+w);
	}
}

泛型定义在方法上时,应放在返回值类型之前,修饰符之后。

泛型接口

//定义泛型接口
interface Inter<T>
{
	void show(T t);
}
//泛型接口的实现有两种情况
//实现时明确数据类型
class InterImpl implements Inter<String>
{
	public void show(String t)
	{
		System.out.println("show :"+t);
	}
}

/实现时还不能明确数据类型
class InterImpl<T> implements Inter<T>
{
	public void show(T t)
	{
		System.out.println("show :"+t);
	}
}

泛型的高级应用

通配符

在泛型中?是通配符、占位符。

public static void printColl(ArrayList<?> al)
{
	Iterator<?> it = al.iterator();
	while(it.hasNext())
	{
		System.out.println(it.next());
	}
}

T?的区别

public static<T> void printColl(ArrayList<T> al)
{
	Iterator<T> it = al.iterator();
	while(it.hasNext())
	{
		T t=it.next();//用T可以接受和操作类型,而?不可以。
		System.out.println(it.next());
	}
}

与多态道理一致,泛型不能使用类型特有方法。

泛型的限定

ArrayList< Person> al = newArrayList<Student>();                  error

<? extends E>  只接受E类型或E的子类型;限制上限

TreeSet(Collection<?extends E> c)                   构造函数传入可比较的对象

<? super E>      只接受E类型或E的父类型;限制下限

TreeSet(Comparator<?super E> comparator)        构造函数传入比较器

泛型限定是进行 泛型扩展用。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值