gpt4 book ai didi

Java - 泛型与转换对象

转载 作者:行者123 更新时间:2023-12-03 01:02:42 25 4
gpt4 key购买 nike

我有课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,然后每个数据对象可以是异构的
还可以注册用于 float 和长检测的适配器,但它不会更快或更好

编辑:gson 无法检索长整型:

或者:

 ((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 注册类型适配器

tsOverflow 的 edit2:

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

最佳答案

泛型的要点是允许一个类同时使用不同的类型。

泛型允许您定义/限制对象实例使用的类型。

泛型背后的想法是消除强制转换的需要。

在你的类中使用泛型应该会产生如下结果:

Data<String> stringData = new Data<String>();
String someString = stringData.getValue();

Data<Long> longData = new Data<Long>();
Long someLong = longData.getValue();

Data<List<String>> listData = new Data<List<String>>();
List<String> someList = listData.getValue();

您应该使用对象并进行强制转换——或者——使用泛型来避免强制转换。

您似乎认为泛型允许在同一实例中进行异构类型。

这是不正确的。

如果您希望列表包含混合类型,那么泛型不合适。

<小时/>

还有...

要从 double 型创建长整型,请使用 Double.longValue() .

要从 double 型创建浮点型,请使用 Double.floatValue() .

我建议阅读the documentation .

关于Java - 泛型与转换对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11401726/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com