2013-09-28 69 views
0

我想写一个方法,如果可能的话,它返回一些PrimitiveType类型,如float,integer,boolean和String。我想使用它的泛型,但我坚持,并没有找到它的解决方案。我确实需要它作为Configparser。我用它来从配置中获取不同的值。java泛型T扩展了Simpletype?

当前的IT DES是这样的,我知道,交换机不喜欢这个工作,但你得到的是什么ID喜欢做一个想法:

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"); 
    } 
} 

非常感谢

+0

只是澄清...''字符串'类型是引用类型而不是原始类型。而且,原始类型不能用作Java中泛型类型参数的参数。只有引用类型可以作为参数提供...如果需要,您可以始终使用基本类型的盒装形式。 – scottb

+0

谢谢我知道,但这就是我想得到的,所以我试图找到一个可能的解决方案 – BennX

回答

2

好吧,我不“认为你可以用原始类型直接做到这一点,但如何对这样的事情:

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"); 
} 
+0

有没有办法让T显式的类型?例如像T延期浮动?那就是我正在寻找的。 – BennX

+1

@BennX如果你只想只支持数字,你可以这样:''public static T getConfig(类类型,字符串名称)'''。但是,你不能期望传递一个String类作为参数。 –

+0

非常感谢它! – BennX

1

你可以使用一个枚举,以避免分支逻辑和显式转换。

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); 
}