Java静态方法从字符串解析泛型枚举集

Java静态方法从字符串解析泛型枚举集,java,generics,enums,set,Java,Generics,Enums,Set,我有很多类,它们定义了一些枚举,我希望从用户输入的字符串中加载这些枚举的值。因此,我发现自己在重复这个方法: public final class Status { public static enum TYPE { Slow, Haste, Sleep, Stop, Stone, Invis, Rage, Conf, Bleed, Weak, Dumb, Sil, Rot, Lev, Clumsy }; public static Set<Status.

我有很多类,它们定义了一些枚举,我希望从用户输入的字符串中加载这些枚举的值。因此,我发现自己在重复这个方法:

public final class Status {
    public static enum TYPE { Slow, Haste, Sleep, Stop, Stone, Invis, Rage,
        Conf, Bleed, Weak, Dumb, Sil, Rot, Lev, Clumsy };

    public static Set<Status.TYPE> typesFromString(String string) { 
        EnumSet<Status.TYPE> set = EnumSet.noneOf(Status.TYPE.class);
        if (string == null)
            return set;
        String[] elements = string.split(",");
        for (String element : elements) {
            element = element.trim();
            for (TYPE type : EnumSet.allOf(Status.TYPE.class)) {
                if (type.toString().equalsIgnoreCase(element)) {
                    set.add(type);
                    break;
                }
            }
        }
        return set;
    }
公共最终类状态{
公共静态枚举类型{慢速、快速、睡眠、停止、石头、隐形、愤怒、,
形态,出血,虚弱,哑,Sil,腐烂,Lev,笨拙};
公共静态集类型fromstring(String String){
EnumSet=EnumSet.noneOf(Status.TYPE.class);
if(字符串==null)
返回集;
String[]elements=String.split(“,”);
for(字符串元素:元素){
element=element.trim();
for(类型:EnumSet.allOf(Status.TYPE.class)){
if(type.toString().equalsIgnoreCase(元素)){
集合。添加(类型);
打破
}
}
}
返回集;
}
也就是说,给定一个字符串,该字符串包含与枚举项匹配的逗号分隔元素,返回一个用每个匹配项填充的集

我很想将此设置为泛型,这样我就不必维护它的十个不同副本,但我不太明白如何在返回一组枚举时将此设置为泛型。我认为它大致类似于以下方法:

public static Set<[Enum Class Specified in Argument]> setFromString(String string, [Class of Enum to Work With]) {
    Set<E extends Enum<E>> set = EnumSet.noneOf([Class of Enum]);
    if (string == null)
        return set;
    for (String element : string.split(",")) {
        element = element.trim().toLowerCase();
        for ([Element of Enum] type : EnumSet.allOf([Class of Enum])) {
            if (type.toString().trim().toLowerCase().equals(element))
                set.add(type);
        }
    }
}
return set;
public static Set setFromString(String String,[要使用的枚举类]){
Set Set=EnumSet.noneOf([枚举类]);
if(字符串==null)
返回集;
for(字符串元素:String.split(“,”)){
element=element.trim().toLowerCase();
for([Element of Enum]类型:EnumSet.allOf([Class of Enum])){
if(type.toString().trim().toLowerCase().equals(元素))
集合。添加(类型);
}
}
}
返回集;

您需要指定泛型参数(
是的,这就解决了问题。我想我需要复习一下我的泛型,因为我在阅读时了解到了它的要点,但我试图用签名
公共静态集来定义它,这让Java很吃惊。谢谢。(另外,关于伪值的注释对后代来说是很好的。我还在我的用例中考虑它。)无关注释:枚举类型的代码约定是使用大写(即
SLOW,HASTE,SLEEP,STOP…
而不是
SLOW,HASTE,SLEEP,STOP…
)同意,但我也希望直接从这些值中显示,并且我不希望用户看到所有的大写字母。如果有任何方法可以同时兼顾这两个方面,我会洗耳恭听。然后这里:对枚举常量使用大写字母,然后使用
set.add(enum.valueOf(myEnumClazz,element.toUpperCase())
,这也避免了循环。有预先构建的实用程序可以按名称获取枚举常量。您误解了——我希望以后能够调用
状态的
toString()
。键入
并按当前键入的方式显示结果。如果我将枚举项转换为大写,我将获得大写输出。
    public static <E extends Enum<E>> Set<E> parseValues(
        String string, Class<E> clazz
    ) { 
        EnumSet<E> set = EnumSet.noneOf(clazz);
        if (string == null) {
            return set; // ( better, NPE )
        }
        String[] elements = string.split(",");
        for (String element : elements) {
            element = element.trim();
            for (E type : EnumSet.allOf(clazz)) {
                if (type.name().equalsIgnoreCase(element)) {
                    set.add(type);
                    break;
                }
            }
            // ( Do we really want to ignore spurious values? )
        }
        return set;
    }