Java中是否可以使用通用枚举参数?

5

我正在尝试编写一个通用函数,可以接受任何枚举类型,并将其值放入映射中以便在下拉列表中使用。

这是我目前为止的代码(针对特定的枚举类型),我的函数 enumToMap 是否可以重写成通用形式来接受任何枚举类型?

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class Main {

    private enum testenum{
        RED,BLUE,GREEN
    }


    private static Map enumToMap(testenum e){
        HashMap result = new HashMap();
        List<testenum> orderReceiptKeys = Arrays.asList(e.values());
        List<String> orderReceiptValues = unCapsCase(orderReceiptKeys);
        for(int i=0;i<orderReceiptKeys.size();i++){
            result.put(orderReceiptKeys.get(i), orderReceiptValues.get(i));
        }
        return result;
    }

     /**
     * Converts a string in the form of 'TEST_CASE' to 'Test case'
     * @param s
     * @return
     */
    private static String unCapsCase(String s){
        StringBuilder builder = new StringBuilder();
        boolean first=true;
        for(char c:s.toCharArray()){
            if(!first)
                c=Character.toLowerCase(c);
            if(c=='_')
                c=' ';
            builder.append(c);
            first=false;
        }
        return builder.toString();
    }


    /**
     * Converts a list of strings in the form of 'TEST_CASE' to 'Test case'
     * @param l
     * @return
     */
    private static List<String> unCapsCase(List l){
        List<String> list = new ArrayList();

        for(Object o:l){
            list.add(unCapsCase(o.toString()));
        }

        return list;
    }


    public static void main(String[] args) throws Exception {

        try{
            testenum e=testenum.BLUE;
            Map map = enumToMap(e);
            for(Object k:map.keySet()){
                System.out.println(k.toString()+"=>"+map.get(k));
            }
        }catch(Exception e){
            e.printStackTrace();
        }


    }

}

感谢您提供的建议。
2个回答

12

将你的enumToMap方法的签名更改为以下内容:

private static <E extends Enum<E>> Map<E, String> enumToMap(Class<E> enumType)

那么,在您调用 e.values() 的地方,请改为使用 enumType.getEnumConstants()

在您的主方法中,您可以这样调用此方法:

Map<testenum, String> map = enumToMap(testenum.class);

正如seanizer所提到的,你还应该使用EnumMap作为Map实现,而不是HashMap


@Chris:如果这个答案回答了你的问题,请点击勾选接受答案。谢谢!=) - ColinD
我不知道getEnumConstants() +1的含义。 - Wooff

6
不要使用HashMap与枚举,这是EnumMap设计的用途。
正如Sun Java教程中Collection Trail的Map部分所述:

EnumMap作为一个数组内部实现,是一个高性能的Map实现,用于枚举键。此实现结合了Map接口的丰富性和安全性,速度接近数组。如果你想将枚举映射到值,则应始终优先使用EnumMap而不是数组。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接