【发布时间】:2012-07-09 19:25:31
【问题描述】:
我有一堂课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 作为反序列化器,来获取一个 List,然后每个 Data 对象都可以是异构的
也可以为浮点和长检测注册适配器,但它不会更快或更好
编辑:gson 无法检索 long:
要么:
((Long) d.getValue())
java.lang.Double 不能转换为 java.lang.Long
或
Long.parseLong( d.getValue().toString())
java.lang.NumberFormatException:对于输入字符串:“212231.0”
我尝试注册一个 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);
【问题讨论】:
-
您能否详细说明上述代码的动机?这似乎违背了使用泛型的目的。您能否提供: public T getValue() { return value;并让客户担心通过执行适当的转换来提取属性的“真”值?
-
客户端将不得不担心字符串列表、字符串、浮点数或长字符串,这就是为什么最好将它们放在类中
-
正如永恒00b 所说-需要更多关于您到底想要做什么的背景知识。您发布的代码 sn-p 似乎违背了泛型的目的。并且不确定您所说的“每个 Data 对象都可以是异构的”是什么意思 - 如果您正在接收 JSON 并将其通过 GSON 传递以进行反序列化 - 示例 JSON 会有所帮助。
-
大多数情况下,正确的答案是退后一步,并确保您一开始就不会忘记值的类型。你从哪里得到这个?为什么要丢弃变量类型?
-
别用异类的
List,写一个三个字段的类。仅当所有元素都具有或多或少相同的含义时,您才应该使用Lists。
标签: java generics casting gson type-inference