zoukankan      html  css  js  c++  java
  • Java 泛型 (Generics)

    泛型:就是变量类型的参数化

    泛型是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);	
    			
    		}
    	}
    }
    

      

  • 相关阅读:
    20135213 20135231 信息安全系统设计基础课程第二次实验报告
    20135213——信息安全系统设计基础第十二周学习总结
    20135213——信息安全系统设计基础第十一周学习总结
    20135220谈愈敏Blog5_系统调用(下)
    20135220谈愈敏Linux Book_5
    20135220谈愈敏Blog4_系统调用(上)
    20135220谈愈敏Linux Book_1&2
    20135220谈愈敏Blog3_构造一个简单的Linux系统MenuOS
    20135220谈愈敏Blog2_操作系统是如何工作的
    20135220谈愈敏Blog1_计算机是如何工作的
  • 原文地址:https://www.cnblogs.com/linlf03/p/10899647.html
Copyright © 2011-2022 走看看