2014-12-20 5 views
5

Я дал enum ABC и тест класса, и мне нужно вызвать doSomething, но я не могу передать ABC enum в качестве параметра.Inheritance in enum

enum ABC{ 
    A,B,C; 
} 

Class Test{ 

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

} 

Здесь я хочу перечисление DEF, который должен иметь все член ABC, и он должен также иметь член перечислений XYZ (Я хочу перечислимую DEF, который должен содержать элементы двух перечислений (ABC и XYZ)). Пример вроде этого.

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

enum xyz{ 
    X,Y,Z; 
} 

Так что я могу вызвать метод doSomething, который принимает только параметр ABC enum в качестве параметра. Я хочу, чтобы вызвать метод DoSomething() с DEF.Example

class Demo{ 

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

} 

Я посвежее. Пожалуйста, предоставьте мне любую помощь или предложение. Я буду благодарен вам.

+1

Вы не можете расширять 'enum'. Однако вы можете создать интерфейс 'MyInterface' с помощью метода' doSomething() ', а затем сделать' ABC' и 'XYZ' оба реализовать' MyInterface'. Таким образом, вы можете называть 'doSomething()' для любой из шести констант enum. –

ответ

9

Перечисления на Java: final, что означает, что вы не можете расширять и перечислять (вы не можете добавить больше значений в существующее перечисление). В вашем случае ABC и DEF являются совершенно разными объектами с простыми одинаковыми именами элементов перечисления. Это подразумевает, например, что ABC.A != DEF.A.

Существует много способов справиться с этим, однако ни одна из них не является совершенной или простой. Вы должны убеждать, что необходимо в вашем конкретном случае.

Первый способ справиться с этим, чтобы создать общий интерфейс, который ваши перечислений можно продлить:

interface MyInterface{ 

} 

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

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

} 

Таким образом, вы можете использовать как ABC и DEF в doSomething():

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 для более идеи, как для решения наследования enum.

1

Несмотря на то, что вы упомянули одноименное имя, оно не означает то же самое в перечислении. Пример А в ABC является экземпляром ABC. Но A в DEF является экземпляром 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; 
}