泛型:JDK1.5版本出现的新特性,用于解决安全问题,是一个安全机制
好处:
1.将运行时期出现的问题ClassCastException,转移到编译时期,便于程序员解决问题
2.避免了强制转换的繁琐
在使用Java提供的对象时,什么时候写泛型?
通常在集合框架中很常见,只要见到<>就要定义泛型
其实<引用数据类型>就是用来接收类型的
* 特殊之处:
* 静态方法不可以访问类上定义的泛型(静态方法在类定义之时已经存在)
* 如果静态方法操作的引用数据类型不确定,可以将泛型定义在静态方法上
* 类上定义的泛型,整个类都有效
* 方法上定义的泛型,只在方法内有效
* 为了让不同方法可以操作不同类型,而且类型还不确定,那么可以将泛型定义在方法上
//类上定义的泛型作用域为整个类
好处:
1.将运行时期出现的问题ClassCastException,转移到编译时期,便于程序员解决问题
2.避免了强制转换的繁琐
在使用Java提供的对象时,什么时候写泛型?
通常在集合框架中很常见,只要见到<>就要定义泛型
其实<引用数据类型>就是用来接收类型的
* 特殊之处:
* 静态方法不可以访问类上定义的泛型(静态方法在类定义之时已经存在)
* 如果静态方法操作的引用数据类型不确定,可以将泛型定义在静态方法上
* 类上定义的泛型,整个类都有效
* 方法上定义的泛型,只在方法内有效
* 为了让不同方法可以操作不同类型,而且类型还不确定,那么可以将泛型定义在方法上
//类上定义的泛型作用域为整个类
class Demo<T>
{
public void show(T t)
{
System.out.println("show:"+t);
}
//函数上定义的泛型作用域为整个函数内部
public <Q>void print(Q q)
{
System.out.println("print:"+t);
}
}
----------------------------------------------------------------
//定义在接口上的泛型
interface Inter<T>
{
void show(T t);
}
//实现接口时因不明确类型,继续使用泛型
class InterImpl<T> implements Inter<T>
{
public void show(T t)
{
System.out.println("show:"+t);
}
}
* ? 通配符(占位符)
* 泛型的限定:
* 1. ? extends E:可以接收E类型或者E的子类型。上限
* 2. ? super E:可以接受E类型或者E的父类型。下限
//此处可传入Person及其子类对象
public static void print(ArrayList<? extends Person> al)
{
//可接收Person及其子类对象
for(Iterator<? extends Person> it =al.iterator(); it.hasNext();)
{
System.out.println(it.next().getName());
}
}
----------------------------------------------------------------
//传入一个比较器comp(),提供TreeSet排序的依据
TreeSet<Stu> ts = new TreeSet<Stu>(new comp());
ts.add(new Stu("student04"));
ts.add(new Stu("student01"));
ts.add(new Stu("student03"));
print(ts);
//可传入Pepole及其子类对象
class comp implements Comparator<Pepole>
{
//复写compare比较方法
@Override
public int compare(Pepole o1, Pepole o2) {
//compareTo();是String类中的方法
return o1.getName() . compareTo( o2.getName() ) ;
}
}
泛型示例
public static void main(String[] args)
TreeSet<String> ts = new TreeSet<String>(new LenComparator());
ts.add("abcd");
ts.add("cc");
ts.add("cba");
ts.add("aaa");
ts.add("z");
ts.add("hahaha");
Iterator<String> it = ts.iterator();
while(it.hasNext())
{
String s = it.next();
System.out.println(s);
}
class LenComparator implements Comparator<String>
@Override
public int compare(String o1, String o2) {
int num = new Integer(o1.length()).compareTo(new Integer(o2.length()));
if(num==0)
return o1.compareTo(o2);
return num;
}
------------------------------------------------------------------------------------------
class Tool<E>
{
private E e;
public void setObject(E e){
this.e=e;
}
public E getObject(){
return e;
}
}
public class GenericDemo3 {
public static void main(String[] args) {
Tool<Worker> t = new Tool<Worker>();
t.setObject(new Worker());
Worker w = t.getObject();
}
}
---------------------------------------------------------------------------------------
public class GenericDemo6 {
public static void main(String[] args) {
ArrayList<Person> al1 = new ArrayList<Person>();
al1.add(new Person("person01"));
al1.add(new Person("person02"));
al1.add(new Person("person03"));
print(al1);
ArrayList<Student> al2 = new ArrayList<Student>();
al2.add(new Student("Student01"));
al2.add(new Student("Student02"));
al2.add(new Student("Student03"));
print(al2);
}
public static void print(ArrayList<? extends Person> al)
{
for(Iterator<? extends Person> it =al.iterator(); it.hasNext();)
{
System.out.println(it.next().getName());
}
}
}
----------------------------------------------------------------------------------------------
public class GenericDemo7 {
public static void main(String[] args) {
TreeSet<Stu> ts = new TreeSet<Stu>(new comp());
ts.add(new Stu("student04"));
ts.add(new Stu("student01"));
ts.add(new Stu("student03"));
print(ts);
TreeSet<Workers> ts1 = new TreeSet<Workers>(new comp());
ts1.add(new Workers("Worker03"));
ts1.add(new Workers("Worker01"));
ts1.add(new Workers("Worker05"));
print(ts1);
}
public static void print(TreeSet ts)
{
for(Iterator<Pepole> it = ts.iterator();it.hasNext();)
{
System.out.println(it.next().getName());
}
}
}
class comp implements Comparator<Pepole>
{
@Override
public int compare(Pepole o1, Pepole o2) {
return o1.getName().compareTo(o2.getName());
}
}