泛型
使用尖括号 <类型> 说明集合存储的数据类型
书写在返回值前边,定义后边。
import java.util.*;
/*
泛型:JDK1.5 版本以后出现新特性。用于解决安全问题,是一个安全机制。
好处:
1.将运行时期出现问题ClassCastException,转移到了编译时期
方便程序员解决问题。让运行时问题减少,安全
2.避免了强制转换麻烦。
*/
class GenericDemo
{
public static void main(String[] args)
{
ArrayList<String> al = new ArrayList<String>();
al.add("abc");
al.add("abc1");
al.add("abc2");
Iterator<String> it = al.iterator();
while(it.hasNext())
{
String s=it.next();
System.out.println(s);
}
}
}
泛型使用
import java.util.*;
class GenericDemo2
{
public static void main(String[] args)
{
LenComparator lc=new LenComparator();
TreeSet<String> ts=new TreeSet<String>(lc);
ts.add("abcdefg");
ts.add("abcde");
ts.add("abcg");
ts.add("abefg");
ts.add("cdefg");
ts.add("efg");
Iterator<String> it=ts.iterator();
while(it.hasNext())
{
String s=it.next();
System.out.println(s);
}
}
}
class LenComparator implements Comparator<String>
{
public int compare(String o1,String o2)
{
if(o1.length()>o2.length())
return 1;
if(o1.length()<o2.length())
return -1;
return o1.compareTo(o2);
}
}
泛型类
import java.util.*;
/* class Tool
{
private Worker w;
public void setWorker(Worker w)
{
this.w=w;
}
public Worker getWorker()
{
return w;
}
} */
class Worker
{
}
class Student
{
}
//泛型前做法
class Tool
{
private Object obj;
public void setObject(Object obj)
{
this.obj=obj;
}
public Object getObject()
{
return obj;
}
}
//泛型类
/*
什么时候定义泛型类?
当类中要操作的引用数据类型不确定的时候
早期定义 Object 来完成扩展
现在定义泛型来完成扩展
*/
class Utils<T>
{
private T t;
public void setObject(T t)
{
this.t=t;
}
public T getObject()
{
return t;
}
}
class GenericDemo3
{
public static void main(String[] args)
{
Utils<Worker> ut = new Utils<Worker>();
ut.setObject(new Worker());
Worker w=ut.getObject();
/* Tool t=new Tool();
t.setObject(new Worker());
Worker w=(Worker)t.getObject();
Tool t2=new Tool();
t2.setObject(new Student());
Student stu=(Student)t.getObject(); */
}
}
泛型方法
在类中函数void之后定义 泛型
该泛型 T只在当前函数内生效.不影响类中其他方法的泛型
import java.util.*;
/* class Demo<T>
{
public void show(T t)
{
System.out.println("show:"+t);
}
public void print(T t)
{
System.out.println("print:"+t);
}
} */
//泛型类定义的泛型在整个类中有效,如果被方法使用,
//那么泛型类的对象明确要操作的具体类型后,所有要操作的类型就已经固定了
//为了让不同方法可以操作不同类型,而且类型还不确定
//那么可以将泛型定义在方法上。
class Demo
{
public <T> void show(T t)
{
System.out.println("show:"+t);
}
public <T> void print(T t)
{
System.out.println("print:"+t);
}
}
class GenericDemo4
{
public static void main(String[] args)
{
/* Demo<Integer> d1 = new Demo<Integer>();
d1.show(567);
d1.print(new Integer(555));
Demo<String> d2 = new Demo<String>();
d2.show("abc");
d2.print(new String("haha")); */
Demo d = new Demo();
d.show("haha");
d.show(new Integer(5));
d.print("ok");
}
}
泛型类和泛型方法同时定义
class Demo<T>
{
public void show(T t) //show使用类的泛型定义T
{
System.out.println("show:"+t);
}
public <E> void print(E e) //print使用方法的局部泛型定义E,改成T也可以正常使用,和类定义的T是不同的泛型。因为方法名定义的是局部泛型
{
System.out.println("print:"+e);
}
}
在main方法中使用下面方式使用该类
Demo<String> d = new Demo<String>();//定义了T是String类型
d.show("haha");
//d.show(new Integer(5));//传入非String类型编译失败
d.print("ok");//传入不同类型不影响
d.print(5);//
静态泛型方法
静态泛型方法定义
/*
特殊之处:
静态方法不可以访问类上定义的泛型。
如果静态方法操作的应用数据类型不确定,可以将泛型定义在方法上。
*/
class Demo<T>
{
public void show(T t)
{
System.out.println("show:"+t);
}
public <T> void print(T e)
{
System.out.println("print:"+e);
}
public static <W> void method(W t)//静态泛型方法
{
System.out.println("method:"+t);
}
}
调用方法:
Demo.method("static");
泛型接口
泛型定义在接口上
import java.util.*;
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);
}
}
class GenericDemo5
{
public static void main(String[] args)
{
/* InterImpl i= new InterImpl();
i.show("ok"); */
InterImpl<Integer> i = new InterImpl<Integer>();
i.show(4);
}
}
输出:
Show:4
泛型限定 ? 占位符
import java.util.*;
class GenericDemo6
{
public static void main(String[] args)
{
ArrayList<String> al = new ArrayList<String>();
al.add("abc1");
al.add("abc2");
al.add("abc3");
ArrayList<Integer> al1 = new ArrayList<Integer>();
al1.add(4);
al1.add(5);
al1.add(6);
printColl2(al);
printColl2(al1);
}
public static void printColl(ArrayList<?> al)//使用?代表占位符,不明确具体类型,
{
Iterator<?> it = al.iterator();
while(it.hasNext())
{
System.out.println(it.next());
}
}
public static <T> void printColl2(ArrayList<T> al)//使用T可以在函数内对该类型进行操作
{
Iterator<T> it = al.iterator();
while(it.hasNext())
{
T t=it.next();
System.out.println(t);
}
}
}
泛型限定1 < ? extends 类型>
泛型的限定:
? extends E: 可以接受 E 类型或者E的子类型,上限
? super E:可以接受E类型或者E的父类型,下限
import java.util.*;
class GenericDemo6
{
public static void main(String[] args)
{
ArrayList<Person> al2 = new ArrayList<Person>();
ArrayList<Student> al3= new ArrayList<Student>();
al2.add(new Person("lili"));
al2.add(new Person("nana"));
al3.add(new Student("kiki"));
al3.add(new Student("qqqq"));
printColl3(al2);
printColl3(al3);
}
public static void printColl3(ArrayList<? extends Person> al)//使用? extends 限定类型
{
Iterator<? extends Person> it = al.iterator();
while(it.hasNext())
{
//Person p=(Person)it.next();
System.out.println(it.next().getName());
}
}
}
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);
}
}
输出:
lili
nana
kiki
qqqq