泛型:就是变量类型的参数化
泛型是JDK1.5中的一个最重要的特征。通过引入泛型,我们将获得编译时类型的安全和运行时更小的抛出ClassCastException的可能。
public class ArrayListTest {
public static void main(String[] args) {
List list = new ArrayList();
list.add("Nick");
list.add(new Integer(20));
list.add(new Boolean(false));
String str = (String) list.get(0);
Integer in = (Integer)list.get(1);
String b = (String)list.get(2);
}
}
运行后,String b = (String)list.get(2);将抛出异常
Exception in thread "main" java.lang.ClassCastException: java.lang.Boolean cannot be cast to java.lang.String at com.example.fanxing.ArrayListTest.main(ArrayListTest.java:16)
定义两个类,如下图

以上两个类结构时一致的,如果在增加一种类型,如String,还需要创建StringDemo类。
可以优化成一个类统一处理:
public class ObjectDemo {
private Object falg ;
public Object getFalg() {
return falg;
}
public void Integer(Object falg) {
this.falg = falg;
}
}
然后使用ObjectDemo
public static void main(String[] args) {
ObjectDemo obj1 = new ObjectDemo();
obj1.SetFlag("Nick");
String falg = (String)obj1.getFalg();
System.out.println("falg:" + falg);
ObjectDemo obj2 = new ObjectDemo();
obj2.SetFlag(new Integer(20));
Integer falg2 = (Integer)obj2.getFalg();
System.out.println("falg2:" + falg2);
String falg3 = (String)obj2.getFalg();
System.out.println("falg3:" + falg3);
}
然后String falg3 = (String)obj2.getFalg();异常
java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String at com.example.fanxing.ObjectDemo.main(ObjectDemo.java:27)
2、泛型的使用
public class GenericFlag<T> {
private T flag;
public T getFlag() {
return flag;
}
public void setFlag(T flag) {
this.flag = flag;
}
public static void main(String[] args) {
GenericFlag<Boolean> flag1 = new GenericFlag<Boolean>();
flag1.setFlag(new Boolean(false));
GenericFlag<Integer> flag2 = new GenericFlag<Integer>();
flag2.setFlag(new Integer(20));
Boolean f1 = flag1.getFlag();
System.out.println("f1: " + f1);
Integer f2 = flag2.getFlag();
System.out.println("f2: " + f2);
}
}
3、两个泛型的实现方式
public class Generic<T1, T2> {
private T1 flag1;
private T2 flag2;
public T1 getFlag1() {
return flag1;
}
public void setFlag1(T1 flag1) {
this.flag1 = flag1;
}
public T2 getFlag2() {
return flag2;
}
public void setFlag2(T2 flag2) {
this.flag2 = flag2;
}
public static void main(String[] args) {
Generic<Integer, Boolean> flag = new Generic<Integer, Boolean>();
flag.setFlag1(new Integer(20));
flag.setFlag2(new Boolean(false));
System.out.println(flag.getFlag1());
System.out.println(flag.getFlag2());
}
}
4、数组类型的泛型
public class Generic2<T> {
private T[] flagArray;
public T[] getFlagArray() {
return flagArray;
}
public void setFlagArray(T[] flagArray) {
this.flagArray = flagArray;
}
public static void main(String[] args) {
Generic2<String> flag = new Generic2<String>();
String[] str1 = {"Nick","Tom","Larry"};
String[] str2 = null;
flag.setFlagArray(str1);
str2 = flag.getFlagArray();
for(int i = 0; i< str2.length ; i++){
System.out.println(str2[i]);
}
}
}
5、模拟ArrayList功能
public class SimpleCollection<T> {
private T[] objArr;
private int index = 0;
public SimpleCollection() {
objArr = (T[]) new Object[10];
}
public SimpleCollection(int capacity) {
objArr = (T[]) new Object[capacity];
}
public void add(T t) {
objArr[index++] = t;
}
public int getLength() {
return this.index;
}
public T get(int i){
return objArr[i];
}
public static void main(String[] args) {
SimpleCollection<Integer> s = new SimpleCollection<Integer>();
for(int i = 0; i < 10; i++){
s.add(new Integer(i));
}
for(int i = 0; i < 10; i++){
Integer in = s.get(i);
System.out.println(in);
}
}
}
打印结果
0 1 2 3 4 5 6 7 8 9
6、泛型的泛型
/**
* 泛型的泛型
*
*/
public class WrapperFlag<T> {
private GenericFlag3<T> flag;
public GenericFlag3<T> getFlag() {
return flag;
}
public void setFlag(GenericFlag3<T> flag) {
this.flag = flag;
}
public static void main(String[] args) {
GenericFlag3<Integer> flag = new GenericFlag3<Integer>();
flag.setFlag(100);
WrapperFlag<Integer> wrapperFlag = new WrapperFlag<Integer>();
wrapperFlag.setFlag(flag);
GenericFlag3<Integer> g = wrapperFlag.getFlag();
System.out.println(g.getFlag());
}
}
class GenericFlag3<T>{
private T flag;
public T getFlag() {
return flag;
}
public void setFlag(T flag) {
this.flag = flag;
}
}
6、Set泛型
public class SetTest {
public static void main(String[] args) {
Set<String> set = new HashSet<String>();
set.add("a1");
set.add("a2");
set.add("a3");
for(Iterator<String> iterator = set.iterator(); iterator.hasNext();){
String value = iterator.next();
System.out.println(value);
}
}
}
7、Set泛型,类型为对象Student
public class SetTest {
public static void main(String[] args) {
Set<Student> set2 = new HashSet<Student>();
set2.add(new Student("tom", 20, "shanghai"));
set2.add(new Student("Jack", 30, "ShangHai"));
set2.add(new Student("Nick", 40, "YunNan"));
for(Iterator<Student> iterator = set2.iterator(); iterator.hasNext();){
Student student = iterator.next();
String name = student.getName();
int age = student.getAge();
String address = student.getAddress();
System.out.println(name + "," + age +"," + address);
}
}
}
class Student{
private String name;
private int age;
private String address;
public Student(String name, int age, String address) {
this.name = name;
this.age = age;
this.address = address;
}
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 String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((address == null) ? 0 : address.hashCode());
result = prime * result + age;
result = prime * result + ((name == null) ? 0 : name.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Student other = (Student) obj;
if (address == null) {
if (other.address != null)
return false;
} else if (!address.equals(other.address))
return false;
if (age != other.age)
return false;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
}
}
8、Map泛型
public class MapTest {
public static void main(String[] args) {
Map<String, String> map = new HashMap<String, String>();
map.put("a", "aa");
map.put("b", "bb");
map.put("c", "cc");
map.put("d", "dd");
//方式一
Set<String> set = map.keySet();
for(Iterator<String> iter = set.iterator(); iter.hasNext();){
String key = iter.next();
String value = map.get(key);
System.out.println("key:" + key + " value:" + value);
}
System.out.println("--------------------");
//方式二
Set<Map.Entry<String, String>> entriesSet = map.entrySet();
for(Iterator<Map.Entry<String, String>> iter = entriesSet.iterator(); iter.hasNext();){
Map.Entry<String, String> entry = iter.next();
String key = entry.getKey();
String value = entry.getValue();
System.out.println("key:" + key + " value:" + value);
}
}
}