泛型:JDK1.5版本后出现的新特性。用于解决安全问题,是一个安全机制。
泛型格式:通过<>来定义要操作的引用数据类型
泛型在集合框架中很常用,带<>的都可以使用泛型。泛型可以避免强转问题。
例子
import java.util.*;
class GenericityDemo
{
public static void main(String []args)
{
ArrayList<String> al=new ArrayList<String>();
al.add("asd");
al.add("sdf");
al.add("vbv");
Iterator<String> i=al.iterator();//因为是取迭代器中的元素,所以迭代器也要进行泛型修饰
while (i.hasNext())
{
String s=i.next();
System.out.println(s);
}
}
}
泛型类:当类中要操作的引用数据类型不确定,早起使用object类,现在使用泛型。
早起使用object类来解决引用数据不确定
这种情况当传入不同的引用数据类型,如果没有进行相应的强转操作,在编译时期没错,运行就会出现错误。
class Worker
{
}
class Student
{
}
class Tools
{
private Object obj;
public void setObject(Object obj)
{
this.obj=obj;
}
public Object getObject()
{
return obj;
}
}
class GenericityDemo1
{
public static void main(String[]args)
{
Tools t=new Tools();
t.setObject(new Worker());//这时这里换成一个new Student()对象时,则会出现类型转换异常,而必须得将下面强转类型改变
Worker w=(Worker)t.getObject();
}
}
使用泛型类之后,如果传入的是不同于泛型的引用数据类型,则会在编译时期就进行报错,来交给程序员处理
class Worker
{
}
class Student
{
}
class Utils<MM>
{
private MM m;
public void setObject(MM m)
{
this.m=m;
}
public MM getObject()
{
return m;
}
}
class GenericityDemo1
{
public static void main(String[]args)
{
Utils <Worker>u=new Utils<Worker>();
u.setObject(new Worker());//如果这里换为Student()等其他类,则会在编译时出错。
u.getObject();
}
}
*泛型方法
定义普通方法时必须要指定传入参数的类型,当定义泛型方法时,就可以定义泛型,可以传入任何类型
静态方法不可以访问类上定义的泛型。
如果静态方法操作的数据类型不确定,可以将泛型定义在静态方法上。
public static void method();泛型必须在返回类型的前面。
class Demo
{
public <T>void show(T t)
{
System.out.println(t);
}
public <M>void print(M m)
{
System.out.println(m);
}
}
class GenericityMethod
{
public static void main(String []args)
{
Demo d=new Demo();
d.show("haha");
d.show(3.18598);
d.print(5);
d.print("tdf");
}
}
*泛型接口
interface Inter<T>
{
show(T t);
}
泛型限定
import java.util.*;
class Person
{
private String name;
Person(String name)
{
this.name=name;
}
public String getName()
{
return name;
}
}
class Student extends Person
{
Student(String name)
{
super(name);
}
}
class GenericityTest
{
public static void main(String []args)
{
ArrayList<Person> al=new ArrayList<Person>();
al.add(new Person("dfgd"));
al.add(new Person("ret"));
al.add(new Person("fdasdfs"));
printColl(al);
ArrayList<Student> al1=new ArrayList<Student>();
al1.add(new Student("student1"));
al1.add(new Student("student2"));
al1.add(new Student("student3"));
printColl(al1);
}
public static void printColl(ArrayList<? extends Person> al)
{
Iterator <? extends Person>it=al.iterator();
//如果这里只有一个<?>,则会出现没有getName()这个符号的错误,因为<?>
//返回的是Object,而Object类中并没有getName这个方法,被教程误导了。
while (it.hasNext())
{
System.out.println(it.next().getName());
}
}
}