我有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的能夠聲明類型的方法,你不能爲字段?或者我非常困惑,以至於我的問題沒有道理可言?
我很害怕那個......呃。我認爲在我的情況下,只是接受Java的類型系統被延遲(謝謝,鍵入擦除!)並使用「Class enumClass;結合自由胡言亂語@ShutTheHellUp(「unchecked」); 感謝您的迴應,但。 – 2010-06-20 17:18:30