2014-12-20 64 views
5

我已經給出了一個枚舉ABC和一個類Test,並且我必須調用doSomething,但是我無法將ABC枚舉傳遞爲參數。枚舉的繼承

enum ABC{ 
    A,B,C; 
} 

Class Test{ 

    public void doSomething(ABC abc) 
    { 
    //some work 
    } 

} 

在這裏,我想應該有ABC的所有成員一個枚舉DEF,它也應該有枚舉XYZ(我想枚舉DEF應該包含兩個枚舉(ABC和XYZ)的成員)的成員。像這樣的例子。

enum DEF 
{ 
    A,B,C,X,Y,Z,D; 
} 

enum xyz{ 
    X,Y,Z; 
} 

這樣我就可以調用doSomething方法,它只需要使用ABC枚舉作爲參數。我想用DEF調用doSomething()方法。例子

class Demo{ 

    public static void main(String[] ags) 
    { 
     Test test= new Test(); 
     test.doSomething(DEF.A); 
     } 

} 

我很新鮮。請給我任何幫助或建議。我會很感激你。

+1

您不能擴展'enum's。然而,你可以用'doSomething()'方法創建一個接口'MyInterface',然後讓'ABC'和'XYZ'實現'MyInterface'。這樣你可以在六個枚舉常量中的任何一個上調用'doSomething()'。 –

回答

9

Java中的枚舉是final,這意味着你不能擴展和枚舉(你不能在現有的枚舉中添加更多的值)。在你的情況下,ABCDEF是完全不同的實體,它們具有簡單的相同名稱的枚舉項。這牽涉到例如ABC.A != DEF.A

有很多方法來處理,但是沒有一個是完美或簡單的。你應該忽略你的特定情況下需要的東西。

首先來處理的方法是創建一個通用的接口,你的枚舉可以擴展:

interface MyInterface{ 

} 

enum ABC implements MyInterface{ 
    A,B,C; 
} 

enum DEF implements MyInterface{ 
    A,B,C,X,Y,Z,D; 

} 

這樣,您就可以使用doSomething()ABCDEF

Class Test{ 

    public void doSomething(MyInterface abc) 
    { 
    //some work 
    } 

} 

其他方法是爲您的班級添加泛型。這樣,您就可以創建具體的實現,這將支持指定枚舉:

class GenericTest<E extends Enum<E>>{ 
    public void doSomething(E enum){ 
    } 
} 

class TestWhichAcceptsABC extends GenericTest<ABC>{} 

class TestWhichAcceptsDEF extends GenericTest<DEF>{} 

第三種方式是創建多個方法,每個需要被處理

Class Test{ 

    public void doSomething(ABC abc) 
    { 
    //some work 
    } 

    public void doSomething(DEF abc) 
    { 
    //some work 
    } 

} 

更多的想法是怎麼看This thread枚舉解決枚舉繼承。

1

即使您提到了相同的名稱,它並不意味着在枚舉中相同。 對於ABC中的示例A是ABC的實例。但DEF中的A是DEF的實例。所以它與衆不同。您可以在枚舉中實現接口。

enum ABC implements X{ 
    A,B,C; 
} 

public class Test{ 

    public void doSomething(X x) 
    { 

    } 
} 

你會試試這個。

-2

您不能擴展枚舉,但您可以通過模擬枚舉的行爲來做下一個最好的事情。您可以創建一個具有靜態值的類。喜歡這個。

public class abc extends yxz { 
    public static final int A = 1; 
    public static final int B = 2; 
    public static final int C = 3; 
}