2011-05-29 23 views
3

,如果我需要寫在類型的數據工作的類「可比」,我能做到這一點有兩種方式:使用參數(通用)的Java類與正常類

1)

public class MyClass<T extends Comparable> 
{ 

    private T value; 

    MyClass(T value) 
    { 
     this.value = value;  
    } 

    other code... 
} 

2)

public class MyClass 
{ 

    private Comparable value; 

    MyClass(Comparable value) 
    { 
     this.value = value;  
    } 

    other code... 
} 

這兩種方法哪一種更好,爲什麼?一般來說,如果爲什麼使用泛型時更好,而不使用泛型就可以實現相同的功能?

+0

您的泛型版本應該會給您一個關於使用原始類型的編譯器警告。 – 2011-05-29 18:29:14

回答

6

這取決於你的班級的其他人。例如如果你有一個方法getValue,那麼通用的方法將是可取的,因爲你可以這樣做:

public class MyClass<T extends Comparable> 
{ 

    private T value; 

    MyClass(T value) 
    { 
     this.value = value;  
    } 

    T getValue() { 
     return this.value; 
    } 

    other code... 
} 

沒有泛型,某些類型的信息會丟失,因爲你只能返回一個Comparable

4

一般情況下不是。只有當您想要添加本來不存在的類型安全時,才應該使用泛型。無論是你的榜樣班的情況如何,我們都無法分辨。如果您的班級共同處理了多個Comparable對象,則可以使用泛型來強制它們都爲Comparable<T>,其值爲T;但如果不是,這裏可能沒有理由使用泛型。

0

泛型的主要原因是隻能使用1種類型(類型安全)。除非你做出來,然後才能使用任何東西。我個人會與第1步。

1

當使用泛型時,您可以返回對象,因爲它會聲明爲編譯時間。如果不使用泛型,則需要在使用泛型時將其轉換爲正確的類型。例如

//Generic class 
class CGeneric<T extends Comparable> 
{ 
    private T obj; 
    public T getObj() { return obj; } 
    public void setObj(T value) { obj = value;: } 
} 

//Non-generic class 
class CNormal 
{ 
    private Comparable obj; 
    public Comparable getObj() { return obj; } 
    public void setObj(Comparable value) {obj = value;} 
} 

當CGeneric的實例調用getObj可以使用對象作爲MyComparable(如果你想使用聲明是否有特殊的方法)。如果你在一個調節器上調用getObj,你會得到一個Comparable(在編譯時),你必須將它轉換爲MyComparable來使用你可能在其中的特殊方法。

因此,泛型爲您提供編譯時類型檢查,並且您不會遇到CastException。

2

泛型提供了更大的編譯時類型安全性。由於type erasure,它們對運行時性能沒有(直接)影響。

也就是說,你的例子可能會受益於泛型。就目前而言,它應該產生一個關於使用原始類型的編譯器投訴。它必須進行修改,以這樣的事:

public class MyClass<T extends Comparable<? extends SomeBaseClass>> 
{ 

    private T value; 

    MyClass(T value) 
    { 
     this.value = value;  
    } 

    // other code... 
} 

那麼編譯器可以檢查各類涉及的對象,以確保它們具有相近彼此

0

那麼泛型最顯着的缺點很簡單:它們非常複雜,無法完全正確。 T擴展了Comparable?好的將會起作用,但這是泛型和非泛型的混雜體。所以第一個就可能嘗試將被T延伸可比< T>這將正常工作,但遺憾的是過於嚴格,因爲假設類:

類Foo實現可比<對象>

所以實際實施中應是T延伸可比較的<?超T>。很好,並不那麼複雜。但後來我們得到了像Enum < E這樣的東西,擴展了Enum < E >>,並且真的可以向某人解釋,而不會讓他感到困惑 - 祝你好運。因此,泛型對於USE來說非常有用並且很簡單,但是很難正確寫入(並且不會讓我開始編寫現有庫的正確的二進制向後兼容版本 - 請參閱JDK中的集合庫)。幸運的是,只有少數圖書館作家必須爲其他人從中獲利