2014-12-20 13 views
5

Ho dato un enum ABC e un test di classe e devo chiamare doSomething ma non riesco a passare l'enum ABC come parametro.Ereditarietà enum

enum ABC{ 
    A,B,C; 
} 

Class Test{ 

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

} 

qui voglio un DEF enum che dovrebbe avere tutti i membri della ABC e dovrebbe anche avere membro enum XYZ (voglio un DEF enum che dovrebbe contenere i membri di due enumerazioni (ABC e XYZ)). Esempio come questo

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

enum xyz{ 
    X,Y,Z; 
} 

In modo che possa chiamare il metodo doSomething che accetta solo enum ABC come parametro. Voglio chiamare il metodo doSomething() con DEF.Esempio

class Demo{ 

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

} 

Sono più fresco. Gentilmente dammi qualsiasi aiuto o suggerimento. Sarò grato a voi.

+1

Non è possibile estendere 'enum's. Comunque puoi creare un'interfaccia 'MyInterface' con un metodo' doSomething() ', e quindi fare' ABC' e 'XYZ' entrambi implementano' MyInterface'. In questo modo puoi chiamare 'doSomething()' su una delle sei costanti 'enum'. –

risposta

9

Enum in Java sono final, il che significa che non è possibile estendere ed enumare (non è possibile aggiungere più valori a enum esistente). Nel tuo caso le ABC e DEF sono entità completamente diverse con gli stessi nomi semplici di voci enum. Ciò implica ad esempio che ABC.A != DEF.A.

Ci sono molti modi per gestirlo, ma nessuno di questi è perfetto o semplice. Dovresti evadere ciò che è necessario nel tuo caso specifico.

Primo modo di gestire che è quello di creare un'interfaccia comune, che i tuoi enumerazioni possono estendere:

interface MyInterface{ 

} 

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

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

} 

In questo modo è possibile utilizzare sia ABC e DEF in doSomething():

Class Test{ 

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

} 

altro approccio è aggiungere generici alla tua classe. In questo modo è possibile creare implementazioni concrete che sosterrà enum specificato:

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

class TestWhichAcceptsABC extends GenericTest<ABC>{} 

class TestWhichAcceptsDEF extends GenericTest<DEF>{} 

terzo modo è quello di creare più metodi, uno per ogni enum, che hanno bisogno di essere gestito

Class Test{ 

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

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

} 

Vedere This thread per ulteriori idee su come per risolvere l'ereditarietà dell'enum.

1

Anche se hai menzionato nello stesso nome, non significa lo stesso in enum. Per esempio A in ABC è l'istanza di ABC. Ma A in DEF è l'istanza di DEF. Quindi è diverso. È possibile implementare l'interfaccia in enum.

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

public class Test{ 

    public void doSomething(X x) 
    { 

    } 
} 

Proverai questo.

-2

Non è possibile estendere l'enumerazione ma è possibile fare la cosa migliore simulando il comportamento di un enum. Puoi creare una classe con valore statico. Come questo.

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