2013-10-17 114 views
4

我不完全確定如何提出這個問題,這也是爲什麼我不確定標題等等。開始。使用類對象作爲泛型

假設你有一個對象Foo foo = new Foo()。是否有可能編寫像new ArrayList<foo.getClass()>()這樣的代碼,在運行時會等於new ArrayList<Foo>()

另一個,但相關的問題是:假設類Foo延伸Exception。它是那麼可能寫出像

try{ 
    // ... 
} catch(foo.getClass() e) { 
    // 
} 

這將轉化爲

try{ 
    // ... 
} catch(Foo e) { 
    // 
} 

這是否是可怕的事情不是重要的一部分。但是,無論如何,我想聽聽有資格的意見。

+0

運行時的泛型,我們經常在這裏得到:)在運行時'ArrayList '只是成爲'ArrayList'。擦除發生。只是爲了討厭 - 這可能在C#中。 –

+1

@BenjaminGruenbaum不,它不是。 C#的泛型仍然*主要是*編譯時類型 - 安全特性(除了有意義地執行'typeof(T)'的能力,即你得到一個免費傳遞的類型標記),因此對於你使用反射的類型。 – millimoose

回答

6

不,這在Java語言規範中是不可能的。通用參數純粹是一種編譯時類型 - 安全機制,因此在運行時定義它們是非感性的。

由於其固有的不同角色,代碼中的類文字不能與Class<T>對象互換。後者僅在運行時有意義,並且可以動態變化。

0

類型和它的類文字之間存在細微的但是存在的差異。

類文字是一個模型類型的對象。除此之外,它提供了有關該類型實現的詳細信息。

當你引用一個對象時,你使用了一個類型。通用參數也是如此。它們在源代碼中用類型表示。

例如,一邊寫

String foo = "foo"; 

是合法

"".getClass() foo = "foo" 

不是。

我希望這是有道理的。

編輯:當使用泛型時,通常的模式是將類作爲參數傳遞。

<T> doSomething(Class<T> clazz); 

EDIT2:根據@millimoose評論

編輯
+1

這是一個令人困惑的答案,因爲'Type'是一個JDK類,實際上它的含義與您所描述的不同。另外,你提到的模式很有用,但對OP來說沒用。 – millimoose

+0

@millimoose你是對的,我應該沒有使用大寫字母T。我做了一些編輯。 – dkateros

0

Java不支持這種語法,但如果你的目標是創建一個集合,其類型由一個實例的類型確定,創建一個類型化的方法,如:

public static <T> List<T> createList(T object) { 
    List<T> list = new ArrayList<T>(); 
    list.add(object); 
    return list; 
} 

任何類型的傳遞將確定名單的類型返回。這不是一個運行時確定 - 這是一次編譯時間檢查,但它與我解釋你的意圖最接近。