------- android培训、java培训、期待与您交流! ----------
今天了解到了泛型这个概念,这是第一次接触这个词。
泛型是JDK1.5版本以后出现新特性。用于解决安全问题,是一个类型安全机制。
他的好处是
1,将运行时期出现问题ClassCastException,转移到了编译时期。方便于程序员解决问题。让运行时问题减少,这样更加安全。
2,避免了强制转换麻烦。
泛型格式:通过<>来定义要操作的引用数据类型。
通常在集合框架中很常见到泛型,只要见到<>就要定义泛型。其实<> 就是用来接收类型的。当使用集合时,将集合中要存储的数据类型作为参数传递到<>中即可。
其实<> 就是用来接收类型的。
当使用集合时,将集合中要存储的数据类型作为参数传递到<>中即可。
class GenericDemo
{
public static void main(String[] args)
{
ArrayList<String> al = new ArrayList<String>();
al.add("hahaha01");
al.add("ahahah02");
al.add("aaaaa03");
Iterator<String> it = al.iterator();
while(it.hasNext())
{
String s = it.next();
System.out.println(s+":"+s.length());
}
}
}
数组中在建立的同时就会指定接收的类型,当接收到的数据不是指定类型是就会编译失败。而集合建立的时候却不会指定接受类型,这导致编译的时候不会出错,但是在运行的时候就有可能出错了,这是不安全的,所以,泛型的出现很好的弥补了这一点,让泛型指定集合的接受类型,这样的话,在接收到非指定类型的时候就会编译失败,以便程序员修改代码。
泛型:编译的时候保留泛型信息,编译之后的运行则会把泛型去掉(使两个对象有可能相等)
所以,当我们通过反射绕过编译过程直接对两个数组进行比较时,发现二者虽然带的类型参数不同,但最后却相等。
ArrayList<Integer> al1 = new ArrayList<Integer>();
ArrayList<String> al2 = new ArrayList<String>();
al1.add(5);
al1.add(3);
al1.add(8);
al2.add("5");
al2.add("3");
al2.add("8");
System.out.println("al1class == al2class:" + (al1.getClass()==al2.getClass()));
还有就是虽然泛型确定了类型参数,但通过反射可以加入非指定参数的元素到其中:
ArrayList<Integer> al1 = new ArrayList<Integer>();
al1.add(5);
al1.add(3);
al1.add(8);
al1.getClass().getMethod("add", Object.class).invoke(al1, "aba");
System.out.println(al1.get(3));
System.out.println("size = " + al1.size());
例如上面这段代码,集合原本带的类型参数是Integer,但是通过反射,向其中加入了“abc”这样的字符串
创建数组实例的时候不能用泛型,如:Vector<Integer> v[] = new Vector<Integer>[10];这样就是错误的
泛型的兼容性:Collection<String> c = new Vctor();会报警告,但是能通过
Collection c = new Vectro<String>();同样会警告,但是编译可以通过
泛型的参数类型不考虑类型参数继承关系,如:
Vector<String> v = new Vector<Object>();
Vector<Object> v = new Vector<String>();
虽然Object和String 类型是父子类关系,但是在泛型中的类型参数不考虑继承关系。