Java - Generics vs Casting Objects
У меня есть классData<T>
с общим атрибутом
private T value;
Есть ли лучший способ сделать следующее?
т.е. возвращение универсального типа в разных формах?
public List<String> getValues() {
if (value.getClass() != ArrayList.class)
throw new Exception("Wrong Enum value '%s'", value);
return (ArrayList<String>) value;
//ugly
}
public String getStringValue() {
if (value.getClass() != String.class)
throw new Exception("Wrong value type '%s'", value);
return (String) value;
//ugly
}
public Float getFloatValue() {
if (value.getClass() != Double.class)
throw new Exception("Wrong value type '%s'", value);
return (Float) value;
//ugly
}
public Long getLongValue() {
if (value.getClass() != Double.class)
throw new Exception("Wrong value type '%s'", value);
return (Long) value;
//ugly
}
public T getValue() {
return value;
}
Точность, я использую Gson в качестве десериализатора, чтобы получить список, каждый объект данных может быть разнородным
Может также регистрировать адаптеры для обнаружения с плавающей запятой и длительного обнаружения, но это не будет быстрее или лучше
edit: gson не может получить longs:
или:
((Long) d.getValue())
java.lang. Двойной нельзя привести к java.lang.Long
или же
Long.parseLong( d.getValue().toString())
java.lang.NumberFormatException: для входной строки: & quot; 212231.0 & quot;
Я пытался зарегистрировать LongAdpater
gsonBuilder.registerTypeAdapter(Long.class, new LongAdapter());
private static class LongAdapter implements
JsonSerializer<Long>, JsonDeserializer<Long>
{
@Override public Long deserialize(
JsonElement json,
Type type,
JsonDeserializationContext arg2) throws JsonParseException
{
return json.getAsLong();
}
@Override
public JsonElement serialize(Long l, Type arg1,
JsonSerializationContext arg2) {
return new JsonPrimitive(new Double(l));
}
}
java.lang.IllegalArgumentException: невозможно зарегистрировать адаптеры типов для класса java.lang.Long
edit2 для tsOverflow:
Data<Float> d1 = new Data<Float>( new Float(6.32));
List<String> l = new ArrayList<String>();
l.add("fr");
l.add("it");
l.add("en");
Data<List<String>> d2 = new Data<List<String>>( l);
Data<Long> d3 = new Data<Long>(new Long(212231));
List<Data> data = new ArrayList<Data>();
data.add(d1);
data.add(d2);
data.add(d3)
new Gson().toJson(data);