泛型详讲
1.泛型的概念:
泛型,JDK1.5新加入的,解决数据类型的安全性问题,其主要原理是在类声明时通过一个标识表示类中某个属性的类型或者是某个方法的返回值及参数类型。这样在类声明或实例化时只要指定好需要的具体的类型即可。
2.泛型引入的必要性:
1)解决元素存储的安全性问题;
2)解决获取数据元素时需要类型强转的问题;
3.泛型典型应用场景
1)在集合中使用泛型
2)自定义泛型类
3)泛型方法
4)泛型接口
4.泛型使用注意事项:
1)当实例化泛型类对象时指明泛型的类型,指明后对应类中所使用泛型的位置都变成实例化中指定的泛型类型;
2)若自定义泛型类,但在实例化时没有使用,默认类型为Object;
3)继承泛型类或接口时可指明具体类型;
4)若类A是类B的子类,那么List<A>就不是List<B>的子接口;
5)List<A>、List<B>均是List<?>的子类
?extends A :可以存放A及其子类
?super A: 可以存放A及其父类
6)集合泛型的本质是把一个集合中的内容限制为一个特定的数据类型,即给类或接口增加类型参数来实现;
7)不能在静态方法或catch()中使用泛型;
8)从泛型类派生 子类,泛型类型需要具体化;
9)不允许向声明为通配符的集合类中写入对象,null可添加;
5.泛型举例:
1)泛型类:
package com.test;
import java.util.*;
class Person<T>{
private String name;
private int age;
private T t;
public Person(String name, int age, T t) {
super();
this.name = name;
this.age = age;
this.t = t;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public T getT() {
return t;
}
public void setT(T t) {
this.t = t;
}
@Override
public String toString() {
return "Person [age=" + age + ", name=" + name + ", t=" + t + "]";
}
}
public class clssDemo {
public static void main(String[] args) {
Person<Integer> a = new Person<Integer>("zhangsan",12,123);
System.out.println("姓名:"+a.getName()+"年龄:"+a.getAge()+"学号:"+a.getT());
}
}
2)集合泛型
package com.test;
import java.util.*;
public class clssDemo {
public static void main(String[] args) {
List<Integer> list = new ArrayList<Integer>();
list.add(123);
list.add(231);
list.add(412);
//遍历输出List
Iterator<Integer> l = list.iterator();
while(l.hasNext()){
System.out.println(l.next());
}
Map<Integer,String> map = new HashMap<Integer,String>();
map.put(100, "AA");
map.put(101, "BB");
map.put(102, "CC");
//遍历输出Map
Set<Map.Entry<Integer,String>> set2 = map.entrySet();
for(Map.Entry<Integer,String> ss:set2){
System.out.println(ss.getKey()+"->"+ss.getValue());
}
}
}