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)
}
}