我先對java泛型的注意點還有作用,優勢做一個簡單的闡述
1. java 泛型參數只能是類類型(如Integer,String,還有一些類類型 ),不能是簡單類型.
2.泛型可以說明任何實例方法中的局部變量,類的成員變量,方法的形式參數,以及方法的返回值.
3.泛型 保證的對象間類型轉換的安全,也簡化了過程,不必在Object類和實際操作的數據類型之間進行強制類型轉換.
4.泛型可以將所有的對象強制類型轉換成自動轉型和隱式類型,泛型擴展了重複使用代碼的能力,而且既安全又簡單.
範例一:在沒有泛型時,大家都會遇到如下問題.
class Apple
{
private static long counter;
private final long id = counter++;
public long id()
{
return id;
}
}
class Orange{}
class Test
{
public static void main(String[]args)
{
ArrayList arrayList = new ArrayList();
//可以想ArrayList中添加任何對像,在編譯期和運行期沒有任何錯誤
for(int i=0;i<3;i++)
{
arrayList.add(new Apple()); }
arrayList.add(new Orange());
for(int i=0; <arrayList.size();i++)
{
Object obj = arrayList.get(i);
//必須進行強制類型轉換
Apple apple = ((Apple)arrayList.get(i)).id();
//當將Orange對象轉換爲Apple時報錯
}
}
}
範例分析: Apple類和Orange 類除了繼承自Object ,兩個類是完全不同的類(如果一個類沒有明確繼承自那個類,那麼他自動繼承自Object類)
因爲ArrayList 保存的是Object類,因此你不僅可以通過ArrayList 中的Add()方法添加Apple對象 還可以添加Orange對象.無論是在
編譯期還是運行期都不會有問題. 當你用ArrayList的get()方法取出你認爲是Apple 對象的方法時,你得到的只是Object 的引用,必須
將其強制轉型爲Apple,否責會有語法錯誤.當將Orange 轉型爲Apple時,就會右語法錯誤.
範例二:用泛型來解決範例一中,不安全,類型轉換,問題,代碼如下
class Test2
{
public static void main(String[]args)
{
ArrayList<Apple> arrayList = new ArrayList<Apple>();
for(int i=0; i<3;i++)
arrayList.add(new Apple());
//不能向ArrayList 中添加Orange對象,泛型已經確定是Apple對象
arrayList.add(new Orange());
//從ArrayList中取出對象,並調用對象的方法
for(int i= 0;i<arrayList.size();i++)
{
//將不需要進行強制類型轉換
System.out.println(arrayList.get(i).id());
}
for(Apple c: arrayList)
{
System.out.println(c.id());
}
}
}
範例三:當你指定某個類型作爲泛型參數時,你並不僅限於只能將該確切類型的對象放置到容器中,向上轉型也可以像作用與其他類型一樣作用於泛型
class a1 extends Apple{}
class a2 extends Apple{}
class a3 extends Apple{}
class Test
{
public static void main(String[]args)
{
ArrayList<Apple> arrayList = new ArrayList<Apple>();
arrayList.add(new a1());
arrayList.add(new a2());
arrayList.add(new a3());
for(Apple c : arrayList)
{
System.out.println(c);
}
}
}
範例三:自定義泛型類
public class MyFirstGeneric<T>
{
T t;
MyFirstGeneric(T t1)
{
t = t1;
}
T getT()
{
return t;
}
void printType()
{
System.out.println(t.getclass.getName());
}
public static void main(String[]args)
{
MyFirstGeneric<String> str = new MyFirstGeneric<String>("sdd");
str.printType();
String string = str.getT();
MyFirstGeneric<Date> date = new MyFirstGeneric<Date>(new Date());
date.printType();
Date d = date.getT();
}
}