1、泛型使用的原因:
安全:放入会自动检查,如果类型错误编译器会报错
List<String> list = new ArrayList<>();
list.add("abc");
list.add(1); //报错无法放入整数
省心:取出的时候自动转为想要的类型
String strGet = list.get(0); //取出就是String类型
否则需要强制转换,因为list.get(int index)取出的是Object类型List list = new ArrayList();
list.add("abc");
Object objGet = list.get(0);
if(objGet instanceof String)
{
String strGet = (String)objGet; //取出就是String类型
}
2.自定义泛型类,例如在自定义个一个栈,因为栈里面放入的数据类型不确定的,所以这边可以使用泛型,方法:类定义时,类名<字母>。
示例:
class myStack<Item> //栈中的元素类型未知,使用自定义泛型类
{
private Item[] a; //声明一个泛型数组
private int N;
public myStack(int cap)
{
a = (Item[])new Object[cap];
}
public boolean isEmpty()
{
return N==0;
}
public void push(Item item)
{
a[N++] = item;
}
public Item pop()
{
return a[--N];
}
}
class Test
{
public static void main(String[] args)
{
myStack<String> stack = new myStack<>(4);//这边栈对象只能添加String类型的数据
}
}
注意:创建泛型数组是不允许的,即无法使用Item[] a = new Item[cap]的方式,要使用类型转换,Item[] a = (Item[])new Object[cap]。
3.泛型接口
public interface Comparator<T>
{
int MAX_VALUE = 1024;
void compare(T t);
}
说明:T只能用在抽象方法上,不能用在修饰MAX_VALUE,例如T MAX_VALUE就会报错。
4.非泛型类中定义泛型方法
方法:在返回类型前面<字母>
示例:
public class Method
{
public static void main(String[] args)
{
test("HelloWorld");
}
public static <T> void test(T t)//泛型方法的使用
{
System.out.println(t);
}
}
使用泛型方法的好处:test方法中,可以传入任意类型的数据,并将其打印出来,上面例子中,传入后"HelloWorld"就将T变成了字符串类型。
将这个方法局限在某些类型下:public static <T extends List>void test(T b),T类型只能是List类型或者List类型的子类型。
class Method
{
public static void main(String[] args)
{
//test("HelloWorld"); // 报错
List list = new ArrayList();
list.add("abc");
test(list); //对象list是List的子类
}
public static <T extends List> void test(T b)//这时T只能是List的子类
{
System.out.println(b);
}
}