概念:泛型(Generic type 或者 generics)是对 Java 语言的类型系统的一种扩展,以
支持创建可以按类型进行参数化的类。简单的说,就是对要操作的对象指定数据类型,其
用法和形参类似。 如:class Dome<T t> 这里的T就是一个数据类型
泛型后的工具类:
class Tool //工具类泛型前
{
private Object obj;
public void setObject(Object obj)
{
this.obj=obj;
}
}
对于泛型前的Object类型,往往在实例的时候需要考虑强制转换,不仅麻烦还容易引发异常
ClassCastException java jdk1.5版本引入了泛
型机制,解决了这类安全隐患。
class Utils<QQ q> //工具类泛型后
{
private QQ q;
public void setObject(QQ q)
{
return q;
}
}
泛型定义在方法上:
为什么要定义在方法上:因为如上的工具类在类上定义泛型后,那么这个类里面的对象的类型
也就固定了。所以,考虑到为了让不同的对象具备不同的类型,而且类型不确定,那么可以将
泛型定义在方法上。
例如:
class Dome
{
public <T> void show(T t)
{
System.out.println("show"+t);
}
public <Q> void print(Q q)
{
System.out.println("print"+q);
}
}
class GenericDome3
{
public static void main(String[] args)
{
Dome d=new Dome();
d.show("haha");
d.show(new Integer(4));
}
}
泛型类和泛型方法组合使用如下:
class Dome <T>
{
public void show(T t)
{
System.out.println("show"+t);
}
public <Q> void print(Q q)
{
System.out.println("print"+q);
}
}
class GenericDome3
{
public static void main(String[] args)
{
Dome<String> d=new Dome<String>();
d.show("haha");
d.print("haha");
d.print(new Integer(4));
}
}
注意:静态方法不可以访问类上定义的泛型,如果静态方法操作的类型不确定,可
以将泛型定义在方法上。
泛型定义在接口上:
interface Inter<T>
{void show(T t)}
class InterImpl<T> implements Inter<T>
{
public void show(T t)
{
System.out.println("show"+t);
}
}
class GenericDemo
{
public static void main(String [] args)
{
InterImpl i=new InterImpl();
i.show("hah");
}
}
泛型的限定:
?通配符,也可以理解为占位符。
?extends E:可以接受E类型或者E的子类型,称为上限。
?super E:可以接受E类型或者E的父类型,成为下限。
class Person
{...}
class Student extends Person
{...}
class Demo
{
ArrayList<Person> al=new ArrayList<Person>();
ArrayList<Student> al1=new ArrayList<Student>();
Iterator<? extends Person>=al.iterator();//(或al1).iterator();这样就既可以迭代Person也可以迭代Student,一般把迭代这部分单独封装成一个功能以提高复用性。
}
下限同理 |