泛型1:

import java.util.*;

/*
泛型:JDK1.5版本以後出現新特性。用於解決安全問題,是一個類型安全機制。

好處
1.將運行時期出現問題ClassCastException,轉移到了編譯時期。,
	方便於程序員解決問題。讓運行時問題減少,安全。,

2,避免了強制轉換麻煩。


泛型格式:通過<>來定義要操作的引用數據類型。

在使用java提供的對象時,什麼時候寫泛型呢?

通常在集合框架中很常見,
只要見到<>就要定義泛型。

其實<> 就是用來接收類型的。

當使用集合時,將集合中要存儲的數據類型作爲參數傳遞到<>中即可。
*/

class GenericDemo 
{
	public static void main(String[] args) 
	{

		ArrayList<String> al = new ArrayList<String>();

		al.add("abc01");
		al.add("abc0991");
		al.add("abc014");

		//al.add(4);//al.add(new Integer(4));
		

		Iterator<String> it = al.iterator();
		while(it.hasNext())
		{
			String s = it.next();

			System.out.println(s+":"+s.length());
		}
	}
}
import java.util.*;
class GenericDemo2 
{
	public static void main(String[] args) 
	{
		TreeSet<String> ts = new TreeSet<String>(new LenComparator());//將集合中要存儲的數據類型作爲參數傳遞到<>中即可。


		ts.add("abcd");
		ts.add("cc");
		ts.add("cba");
		ts.add("aaa");
		ts.add("z");
		ts.add("hahaha");


		Iterator<String> it = ts.iterator();

		while(it.hasNext())
		{
			String s = it.next();
			System.out.println(s);
		}
	}
}


class LenComparator implements Comparator<String>  //將比較器中的元素也限定爲String
{
	public int compare(String o1,String o2)
	{
		int num = new Integer(o2.length()).compareTo(new Integer(o1.length()));

		if(num==0)
			return o2.compareTo(o1);
		return num;
	}
}



class Worker
{

}
class Student
{
}
//泛型前做法。
class Tool
{
	private Object obj;
	public void setObject(Object obj)
	{
		this.obj = obj;
	}
	public Object getObject()
	{
		return obj;
	}
}

//泛型類。
/*
什麼時候定義泛型類?
當類中要操作的引用數據類型不確定的時候, 有時候需要操作worker ,有時候需要操作Student
早期定義Object來完成擴展。
現在定義泛型來完成擴展。
*/
class Utils<QQ>
{
	private QQ q;
	public void setObject(QQ q)
	{
		this.q = q;
	}
	public QQ getObject()
	{
		return q;
	}
}


class  GenericDemo3
{
	public static void main(String[] args) 
	{

		Utils<Worker> u = new Utils<Worker>();  //傳入Worker類

		u.setObject(new Student());
/*
GenericDemo3.java:65: 錯誤: 無法將類 Utils<QQ>中的方法 setObject應用到給定類型;
                u.setObject(new Student());
                 ^
  需要: Worker
  找到: Student
  原因: 無法通過方法調用轉換將實際參數Student轉換爲Worker
  其中, QQ是類型變量:
    QQ擴展已在類 Utils中聲明的Object
1 個錯誤
*/
		Worker w = u.getObject();;
		/*
		Tool t = new Tool();
		t.setObject(new Student());
		Worker w = (Worker)t.getObject();
		*/
	}
}
//泛型定義在接口上。
interface Inter<Q>
{
	 <Q>void show(Q t);
	 void show2(Q t);
}

/*
class InterImpl implements Inter<String>
{
	public void show(String t)
	{
		System.out.println("show :"+t);
	}
}

*/

class InterImpl<T> implements Inter<T>//若爲class InterImpl implements Inter<T> 
//編譯失敗 需要傳入泛型參數 此處接口泛型 和類泛型是一樣的 若不一樣 報錯
{
	public void print(T a)  // 當函數沒有自定義泛型時,只能傳入與類泛型一致的泛型
	{
		System.out.println("print"+a);
	}
	public <k>void  show(k t)  //複寫接口中的 泛型函數
	//當函數有自定義泛型k(也可以寫成T 只是一個符號惡意)時 
	//可以傳入  與類泛型不相同的 泛型
	//  簡單一句話 如果函數需要傳入 泛型 可以傳入  任意泛型
	{
		System.out.println("show :"+t);
	}
	public void show2(T t)  // 複寫接口中的函數 要求傳入的 參數 是屬於類泛型(接口泛型)
	{
		System.out.println("show2 :"+t);
	}
}
class GenericDemo5 
{
	public static void main(String[] args) 
	{

		InterImpl <String> i = new InterImpl<String>();
		i.show("haha");    //
		i.print("haha");  // 當函數沒有自定義泛型時,只能傳入與類泛型一致的泛型
		i.show(new Integer(2));//當函數有自定義泛型時 可以傳入與類泛型不相同的泛型
		//i.print(new Integer(2)); 編譯失敗 
		//InterImpl i = new InterImpl();
		//i.show("haha");


		i.show2("haha");
		//i.show2(new Integer(2)); 編譯失敗 要求傳入的 參數 是屬於類泛型 (String)
	}
}






發佈了22 篇原創文章 · 獲贊 0 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章