2010-06-20 116 views
8

我有4年前爲Java 5編寫的一些舊的命令行參數解析代碼,並且它不會在Java 6中編譯,這要歸功於泛型的處理方式和/或某些庫類是否通用。在嘗試修復它時,我遇到了以下問題;自從我接觸Java已經4年了,我從來就不是仿製藥領域的專家,這有點讓我感到困惑。不能像通用方法類型一樣使用Java通用字段類型?

該庫允許我指定某些命令行選項對應於枚舉。爲此,與此選項對應的ArgumentSpecification對象需要保存一個Class對象,我們將其稱爲「enumClass」,對應於enum類。不幸的是,我似乎無法弄清楚如何正確編寫該字段的類型,以限制它包含與實際的Enum類相對應的類對象。我想我想要的是這樣的:

protected <E extends Enum<E>> Class<E> enumClass; // compiler error 

但編譯器barfs就此。在另一方面,編譯器與返回值和/或參數所指定的方式,有方法完全滿意:

protected <E extends Enum<E>> Class<E> dummyTest(Class<E> foo) { return foo; } // "works" 

我可以嘗試使用本作的領域,而不是:

protected Class<? extends Enum<?>> enumClass; 

但實際上並不工作......代碼的其他部分需要「<E extends Enum<E>>"」類型,所以它們實際上可以獲得E,而這看起來與"<? extends Enum<?>>"不匹配,因爲我得到如下編譯器錯誤:

Bound mismatch: The generic method checkedEnumFromString(Class<E>, String) of type EnumUtil is not applicable for the arguments 
(Class<capture#1-of ? extends Enum<?>>, String). The inferred type capture#1-of ? extends Enum<?> is not a valid substitute for the bounded 
parameter <E extends Enum<E>> 

有沒有辦法在這裏聲明我正在丟失的正確類型的字段?如果是這樣,那是什麼?如果沒有,是不是可怕地破壞了Java的能夠聲明類型的方法,你不能爲字段?或者我非常困惑,以至於我的問題沒有道理可言?

回答

9

如果您需要定義與這樣的明確的參數E一個字段,那麼你可能需要參數,其中場在聲明的類型事情是這樣的編譯:

class MyClass<E extends Enum<E>> { 
    Class<E> enumClass; 
} 
+2

我很害怕那個......呃。我認爲在我的情況下,只是接受Java的類型系統被延遲(謝謝,鍵入擦除!)並使用「Class enumClass;結合自由胡言亂語@ShutTheHellUp(「unchecked」); 感謝您的迴應,但。 – 2010-06-20 17:18:30

7

你試圖聲明一個「通用字段」 - 它本身具有類型參數。 Java中沒有這樣的概念 - 只有方法和類型可以引入類型參數。

由於polygenelubricants說,你可以在類型本身中引入一個額外的類型參數,並將其用作字段的類型。