你能把一个枚举类传递给一个方法(java)

时间:2015-07-19 05:21:32

标签: java generics enums generic-programming

我想将特定的枚举类传递给方法。这可能吗?该方法将接受任何枚举。我正在尝试创建一个函数,它将采用一种枚举并从中创建一个菜单,返回所选的枚举。

示例枚举类

  public enum METHODOFTRANSPORTATION {
        CAR("car"), BUS("bus"), COMMUTTER_RAIL("commuter rail"),MAINMENU("GO TO MAIN MENU");

        private String choice;

        METHODOFTRANSPORTATION(String choice){
            this.choice = choice;
        }

        public String getMethodOfTransportation(){
            return choice;
        }
    }

我实现枚举的示例类

import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;


public class Ticket{

    private static HashMap<Integer, Ticket> hm= new HashMap<>();
    private int ticketID = 0;

    private METHODOFTRANSPORTATION methodOfTransportation;

    Ticket(){
        //Call method of Transportation to create ticket
        //GETTING ERROR HERE!
        this.methodOfTransportation = createMethodOfTransportation(METHODOFTRANSPORTATION);
    }

    Ticket(METHODOFTRANSPORTATION methodOfTransportation){
        this.methodOfTransportation = methodOfTransportation;
    }

    public Enum<?> getMethodOfTransportation() {
        return methodOfTransportation;
    }   

    public Enum<?> createMenuChoice(Enum<?> e) {
        System.out.println("**************************");

        Scanner s = new Scanner(System.in);
        int input = 0;
        boolean intFlag = false;
        Enum<?> mot;

        //Validate user input for menu selection
        do{
            //Print our Enums allowed variables
            for(int i=0; i< e.getDeclaringClass().getEnumConstants().length; i++){
                System.out.printf("%d. %s",i,e.getDeclaringClass().getEnumConstants()[i]);
            }

            System.out.println("Please enter a valid menu entry (");
            for(int i = 0; i< e.getDeclaringClass().getEnumConstants().length; i++){
                if(i == e.getDeclaringClass().getEnumConstants().length){
                    System.out.println(i);
                }
                else{
                    System.out.print(i + ",");
                }
            }
            System.out.print("> ");

            if(s.hasNextInt()){
                input = s.nextInt();
                for(int i = 0; i< e.getDeclaringClass().getEnumConstants().length; i++){
                    if(input == i){
                        //*********************************************
                        //HOW DO I RETURN THE CORRESPONDING VALUE HERE?
                        //*******************************************
                        mot =  ;
                    }
                }
            }
            else{
                s.next();
            }
        }
        while(false);

        //WHAT SHOULD I RETURN HERE??
        return METHODOFTRANSPORTATION.CAR;
    }


}

这甚至可能吗?我只想要一个方法来获取任何类的枚举,并返回枚举值。有更好的方法吗?

基本上我的驱动程序类看起来像

public class Driver {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Ticket t = new Ticket();

        Enum<?> mot = t.getMethodOfTransportation();
        if(mot == METHODOFTRANSPORTATION.CAR){
            //....
        }
        //...

        //OR
        /*
         * switch(mot){
         *      case(METHODOFTRANSPORTATION.CAR): ...
         *      ...
         *      ...
         * }
         */
    }


}

3 个答案:

答案 0 :(得分:1)

在Java中引用类的正确方法是ClassName.class。所以你的行将是:

this.methodOfTransportation = createMethodOfTransportation(METHODOFTRANSPORTATION.class);

METHODOFTRANSPORTATION.class返回Class类型的对象。然后,您可以使用反射来检查其名称,可能的值等。Here is more info on enum reflection.

但名称createMethodOfTransportation不合适,因为它与特定的枚举METHODOFTRANSPORTATION没有任何关系。

答案 1 :(得分:1)

是的,有可能。您可以这样声明您的方法:

public <T extends Enum<T>> T doSomething(Class<T> clazz) {
     EnumSet<T> all = EnumSet.allOf(clazz);
     ......
}

或者您甚至可以避开整个Class<T>部分,只需要EnumSet个选项:

public <T extends Enum<T>> T menu(EnumSet<T> options) {
     List<T> lst = new ArrayList(options);
     int idx;
     // display the list and prompt for idx
     return lst.get(idx);
}

然后你会把它称为:

METHODOFTRANSPORTATION mot = menu(EnumSet.allOf(METHODOFTRANSPORTATION.class));

现在你不必乱搞反思。让EnumSet为你做这件事。

答案 2 :(得分:0)

谢谢你们,我找到了解决方案。 @BoppreH谢谢!!

Ticket.java createMenuChoice方法

    //Using introspection
    public Enum<?> createMenuChoice(Class<?> c) {
        //Variables
        int input = -1;
        Enum<?> output = null;
        Scanner s = new Scanner(System.in);

        do{
            //Print Menu
            for(int i = 0; i < c.getEnumConstants().length; i++){
                System.out.printf("%d. %s\n",i+1,c.getEnumConstants()[i].toString());
            }

            //Get Selection
            System.out.println("Please enter a valid menu entry");

            if(s.hasNextInt()){
                input = s.nextInt();
                for(int i = 0; i < c.getEnumConstants().length; i++){
                    if(input == i + 1){
                        return (Enum<?>) c.getEnumConstants()[i];
                    }
                }
            }
            else{
                s.next();
            }
        }while(true);
    }
}

Driver.java我可以使用

调用它
MainMenu inputMm = (MainMenu) t.createMenuChoice(MainMenu.class);

然后使用

检查条目
if(inputMm == MainMenu.BUY_PASS){
} ....