2014-12-05 28 views
3

項枚舉假如我有幾個特定的​​類,所有擴展一個抽象類,像這樣:(?相關)創建相關的類

public abstract AbstractClass { 
    // abstract stuff here 
} 

public FirstSpecificClass extends AbstractClass { 
    // specific stuff here 
} 

public SecondSpecificClass extends AbstractClass { 
    // specific stuff here 
} 

我需要在其他地方創建一個enum,其中每個條目連接與一個特定的類;爲此,我將特定類作爲構造函數參數傳遞並將其作爲私有字段存儲在枚舉中(我也爲該字段提供了一個getter方法)。我還需要創建一個靜態方法,它將某個特定類的實例作爲參數並返回適當的枚舉元素(或null)。我將通過遍歷每個枚舉條目並將instanceof與前面提到的專用字段的getter結合使用來完成此操作。這是我的嘗試:

public enum Types { 
    FIRST(FirstSpecificClass.class), // line 2 
    SECOND(SecondSpecificClass.class); // line 3 

    private Class<AbstractClass> classType; 

    private Types(Class<AbstractClass> classType) { 
    this.classType = classType; 
    } 

    public Class<AbstractClass> getClassType() { 
    return this.classType; 
    } 

    public static Types fromTypeInstance(AbstractClass instance) { 
    for(Types t : Types.values()) 
     if(instance instanceof t.getClassType()) return t; // line 17 
    return null; 
    } 
} 

我似乎誤解了如何將類類型存儲爲一個字段,以便它可以在instanceof檢查後返回和使用。這個代碼是生產幾種編譯時錯誤:

  • (2枚舉的線):構造Types(Class<FirstSpecificClass>)未定義
  • (枚舉的3線):構造Types(Class<SecondSpecificClass>)未定義
  • (線枚舉的)17:數不兼容類型booleanClass<AbstractClass>

我不是通常是一個Java程序員,和我的泛型的理解和instanceof是模糊的最好的,雖然我有一個公關etty公司把握OOP的概念。我如何解決這些錯誤並達到預期效果?

回答

5

在Java中,泛型是不變的。這意味着Class<FirstSpecificClass>不是Class<AbstractClass>,即使FirstSpecificClassAbstractClass

您可以通過顯式允許具有上界通配符的子類型來解決此問題。在需要的AbstractClass類型參數之前加上? extends

private Class<? extends AbstractClass> classType; 

private Types(Class<? extends AbstractClass> classType) { 
    this.classType = classType; 
} 

public Class<? extends AbstractClass> getClassType() { 
    return this.classType; 
} 

此外,您必須爲instanceof操作的源代碼直接指定的類型,所以這並不編譯:

if(instance instanceof t.getClassType()) 

可以使用Class object's isInstance method相反,對於一個運行時的解決方案:

if(t.getClassType().isInstance(instance)) 
+0

aha!謝謝!這解決了構造函數中的類型不兼容問題。我仍然在'instanceof'檢查中得到一個錯誤,因爲右邊的參數實際上不應該是一個Class對象(顯然它需要是一個「類型」)。我如何在適當的情況下進行投票以實現檢查實例? – 2014-12-05 20:07:15

+0

你解決了,因爲我打字。謝謝! – 2014-12-05 20:07:47

+0

我也注意到這個錯誤,我更新了我的答案。 – rgettman 2014-12-05 20:08:12