首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >java泛型T扩展Simpletype?

java泛型T扩展Simpletype?
EN

Stack Overflow用户
提问于 2013-09-28 14:21:49
回答 2查看 155关注 0票数 0

我想写一个方法,如果可能的话,它会返回一些PrimitiveType,如浮点数、整数、布尔值和字符串。我想为它使用泛型,但我坚持,并没有找到解决办法。我确实需要它作为一个配置解析器。我使用它从Config获得不同的值。

当前,des看起来是这样的,我知道开关不是这样工作的,但是您知道我喜欢做什么:

代码语言:javascript
复制
public class ConfigurationManager extends XmlReader {
    private final static String FILE_PATH = "config/config.cfg";
    private static Element xml;

    public ConfigurationManager() throws IOException {
        FileHandle handle = Gdx.files.internal(FILE_PATH);
        this.xml = this.parse(handle);
    }

    public Resolution getResolution() {
        Resolution r = new Resolution();
        r.height = xml.getFloat("height");
        r.width = xml.getFloat("width");
        return r;
    }

    public static <T> T getConfig(Class<T> type, String name) {
        if (type.equals(Integer.class)) {
            return type.cast(xml.getInt(name));
        } else if (type.equals(Float.class)) {
            return type.cast(xml.getFloat(name));
        } else if (type.equals(Boolean.class)) {
            return type.cast(xml.getBoolean(name));
        } else if (type.equals(String.class)) {
            return type.cast(xml.get(name));
        }
        throw new AssertionError("Invalid type");
    }
}

非常感谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-09-28 14:31:10

嗯,我不认为您可以直接使用原始类型来完成它,但是下面这样的内容如何:

代码语言:javascript
复制
public static <T> T getConfig(Class<T> type, String name) {
   if(type.equals(Integer.class)){
    return type.cast(xml.getInteger(name));
   } else if(type.equals(Float.class)){
    return type.cast(xml.getFloat(name));
   } else if(type.equals(Double.class)) {
    return type.cast(xml.getDouble(name));
   } else if(type.equals(String.class)) {
    return type.cast(xml.getString(name));
   } 
   throw new AssertionError("Invalid type");
}
票数 2
EN

Stack Overflow用户

发布于 2013-09-28 19:51:02

您可以使用Enum来避免分支逻辑和显式转换。

代码语言:javascript
复制
public enum TypeSelector {
    INTEGER() {
        @Override
        public Integer getValue(Elements xml, String name) {
            return xml.getInteger(name);
        }
    },

    DOUBLE() {
        @Override
        public Double getValue(Elements xml, String name) {
            return xml.getDouble(name);
        }
    };

     private static final Map<Class<?>, TypeSelector> SELECTORS = new HashMap<Class<?>, TypeSelector>() {
            {
                put(Integer.class, INTEGER);
                put(Double.class, DOUBLE);

            }
    };

    public static <T> TypeSelector getSelectorForType(Class<T> c) {
       TypeSelector selector = SELECTORS.get(c);
       if (selector == null) {
          throw new AssertionError("Invalid type");
       }
       return selector;
    }

    public abstract <T> T getValue(Elements xml, String name);
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19067950

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档