您可以将枚举 class 传递给方法 (java)
Can you pass an enum class to a method (java)
我想将特定枚举 class 传递给方法。这可能吗?该方法将接受任何枚举。我正在尝试创建一个函数,它将采用一种枚举类型并从中制作一个菜单,returning 已选择的枚举。
枚举示例 class
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;
}
}
我的示例 class 实现枚举
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;
}
}
这可能吗?我只想要一种方法,它将采用枚举的任何 class 和枚举值 return。有更好的方法吗??
基本上我的 driver class 看起来像
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): ...
* ...
* ...
* }
*/
}
}
在 Java 中引用 class 的正确方法是 ClassName.class
。所以你的行是:
this.methodOfTransportation = createMethodOfTransportation(METHODOFTRANSPORTATION.class);
METHODOFTRANSPORTATION.class
returns 一个 Class
类型的对象。然后,您可以使用反射来检查其名称、可能的值等。Here is more info on enum reflection.
虽然名称 createMethodOfTransportation
不合适,因为它与特定枚举 METHODOFTRANSPORTATION
.
没有任何关系
是的,这是可能的。您可以这样声明您的方法:
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
为您完成。
谢谢大家,我找到了解决办法。 @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){
} ....
我想将特定枚举 class 传递给方法。这可能吗?该方法将接受任何枚举。我正在尝试创建一个函数,它将采用一种枚举类型并从中制作一个菜单,returning 已选择的枚举。
枚举示例 class
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;
}
}
我的示例 class 实现枚举
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;
}
}
这可能吗?我只想要一种方法,它将采用枚举的任何 class 和枚举值 return。有更好的方法吗??
基本上我的 driver class 看起来像
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): ...
* ...
* ...
* }
*/
}
}
在 Java 中引用 class 的正确方法是 ClassName.class
。所以你的行是:
this.methodOfTransportation = createMethodOfTransportation(METHODOFTRANSPORTATION.class);
METHODOFTRANSPORTATION.class
returns 一个 Class
类型的对象。然后,您可以使用反射来检查其名称、可能的值等。Here is more info on enum reflection.
虽然名称 createMethodOfTransportation
不合适,因为它与特定枚举 METHODOFTRANSPORTATION
.
是的,这是可能的。您可以这样声明您的方法:
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
为您完成。
谢谢大家,我找到了解决办法。 @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){
} ....