泛型概述
泛型:JDK1.5版本以后出现的新特性。用于解决安全问题,是一个类型安全机制。
好处:
1.将运行时期出现的问题(ClassCastException)转移到了编译时期,方便于程序员解决问题,让运行时期问题减少,安全。
2.避免了强制转换的麻烦。
泛型格式:通过<>来定义要操作的引用数据类型。
在使用java提供的对象时,什么时候写泛型呢?
通常在集合框架中很常见。只要见到<>就要定义泛型。
泛型类
什么时候定义泛型类?
当类中要操作的引用数据类型不确定的时候。早期定义Object来完成扩展。现在定义泛型来完成扩展。
示例:
class Utils<T>
{
private T t;
public void setObject(T t)
{
this.t = t;
}
public T getObject()
{
return t;
}
}
泛型方法
泛型类定义的泛型在整个类中有效。如果被方法使用,那么泛型类的对象明确要操作的具体类型后,所有要操作的类型就已经固定了。所以,为了让不同方法可以操作不同类型,而且类型还不确定。那么可以将泛型定义在方法上。
静态泛型方法
特殊之处,静态方法不可以访问类上定义的泛型。
如果静态方法操作的应用数据类型不确定,可以将泛型定义在方法上。
例:public static <T> void method(T t){}
泛型定义在接口上示例:
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<Integer> i = new InterImpl<Integer>();
i.show(4);
}
}
类型不确定时怎么办?
当我们对象的类型不确定的时候,用<?>。如:public static void demo(ArrayList<?> al){}
<?>与<T>的区别
T:代表具体类型,传进来什么就是什么类型。
?:代表不确定类型,它是一个通配符,也可以理解为占位符。
用<?>好处:提高了扩展性。弊端:不能使用类型的特有方法。如:length();
泛型限定
泛型限定有两个限制 1.上限 我可以向上限定 2.下限 我可以向下限定
格式:
<? extends E>:可以接收E类型或者E的子类型。上限
<? super E>:可以接收E类型或者E的父类型。下限
<? super E>示例:
import java.util.*;
class GenericDemo
{
public static void main(String[] args)
{
TreeSet<Student> ts = new TreeSet<Student>(new Comp());
ts.add(new Student("abc03"));
ts.add(new Student("abc02"));
ts.add(new Student("abc06"));
ts.add(new Student("abc01"));
Iterator<Student> it = ts.iterator();
while(it.hasNext())
{
System.out.println(it.next().getName());
}
TreeSet<Worker> ts1 = new TreeSet<Worker>(new Comp());
ts1.add(new Worker("wabc--03"));
ts1.add(new Worker("wabc--02"));
ts1.add(new Worker("wabc--06"));
ts1.add(new Worker("wabc--01"));
Iterator<Worker> it1 = ts1.iterator();
while(it1.hasNext())
{
System.out.println(it1.next().getName());
}
}
}
class Comp implements Comparator<Person>
{
public int compare(Person p1,Person p2)
{
return p2.getName().compareTo(p1.getName());
}
}
class Person
{
private String name;
Person(String name)
{
this.name = name;
}
public String getName()
{
return name;
}
public String toString()
{
return "person :"+name;
}
}
class Student extends Person
{
Student(String name)
{
super(name);
}
}
class Worker extends Person
{
Worker(String name)
{
super(name);
}
}
总结:
泛型的好处是避免了强转,把错误移到了编译时期,提高了安全性。
泛型除了可以定义在类上,还可以定义在方法上。
泛型限定是用于泛型扩展用的。如果不明确类型可以用<?>来占位。