集合中可以存储任意类型对象,但是在取出时,如果要使用具体对象的特有方法时,需要进行向下转型,如果存储的对象类型不一致,在转型过程中就会出现ClassCastException异常。这样就给程序带来了不安全性。
在jdk1.5以后就有了解决方案——泛型技术:在存储元素时,就不允许存储不同类型的元素。存储了就编译失败。 所以就需要在存储元素时,在容器上明确具体的元素类型,这其实和数组定义很像。
好处:
1)将运行时期的ClassCastException异常转移到了编译时期,进行检查,并以编译失败来体现。 这样有利于程序员尽早解决问题。
2)避免了向下转型(强转)的麻烦。
package cn.hncu.generic.one;
import java.util.ArrayList;
import java.util.List;
public class MySet<E> {
private List<E> list;//必须用Object
public MySet() {
list=new ArrayList<E>(0);
}
public boolean contain(E e){
if(list.size()==0){
return false;
}
Object objs[]=list.toArray();
for(Object obj:objs){
if(obj.equals(e)){//注意要写equal方法
return true;
}
}
return false;
}
public boolean add(E e){
if(contain(e)){
return true;
}
list.add(e);
return false;
}
public E popLast(){
if(list.size()==0){
return null;
}
return list.remove(list.size()-1);
}
public E popFirst(){
if(list.size()==0){
return null;
}
return list.remove(0);
}
public List<E> getAll(){
return list;
}
}
package cn.hncu.generic.one;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
public class Demo1 {
public static void main(String[] args) {
// test();
// test2();
test3();
}
//演示泛型的好处之一:没采用泛弄,对元素的处理不安全。泛型可以把运行期的错误提前到编译期
private static void test() {
// Map map = new HashMap();//无泛型
Map<Integer, Integer> map = new HashMap<Integer, Integer>();//无泛型
map.put(1,2);
map.put(1,2);
map.put(1,2);//允许重复
map.put(1,2);
map.put(1,2);
// map.put("3", "###");//无泛型时,此处不会报错,但有泛型时会报错。
Iterator it=map.entrySet().iterator();
// Iterator<Entry<Integer, Integer>> it=map.entrySet().iterator();
while(it.hasNext()){
// Object obj=it.hasNext();
// String str=(String)obj;
// str=str.substring(2);
// System.out.println(str);
System.out.println(it.next());
}
}
//演示泛型的好处之二:从集合中读取的数据不需要强转,能够自动识别
private static void test2() {
//演示泛型的好处之二:从集合中读取的数据不需要强转,能够自动识别
List<String> list =new ArrayList<String>();
list.add("!!");
list.add("!!!");
list.add("!");
list.add("0000");
// Iterator it = list.iterator();
Iterator<String> it = list.iterator();
while(it.hasNext()){
// String str=(String) it.next();
String str=(String) it.next();//List有泛型,并且Iterator也加泛型,那么这里就不用强转
System.out.println(str);
}
}
//我们自己在MySet中定义泛型,然后在此处进行调用测试
private static void test3() {//什么元素都可以放
MySet<String> set=new MySet<String>();
set.add("###");
set.add("#!!!");
set.add("wang");
set.add("wja");
System.out.println(set.popFirst());
System.out.println(set.popLast());
MySet<Integer> set2 = new MySet<Integer>();
set2.add(100);
int x=set2.popLast();
System.out.println(x);
}
}