2013-09-28 74 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); 
}