如何将这些通用方法调用从C#转换为Java
我有以下C#helper类,它从远程服务器检索Json字符串并将其转换为我需要的类型
public class JsonHelper
{
private JavaScriptSerializer serializer = new JavaScriptSerializer();
public T GetValue<T>(string methodName, object param) where T : IConvertible
{
string result = GetJsonString(methodName, param);
return (T)Convert.ChangeType(obj, typeof(T));
}
public T GetObject<T>(string methodName, object param) where T : new()
{
var result = GetValue<string>(methodName, param);
return serializer.Deserialize<T>(result);
}
}
-
// Usage:
bool value1 = GetValue<bool>(methodName, param);
int value2 = GetValue<int>(methodName, param);
double value3 = GetValue<double>(methodName, param);
User user = GetObject<User>(methodName, param);
List<User> users = GetObject<List<User>>(methodName, param);
现在我希望在java程序中具有相同的功能。目前有两点让我陷入困境:
这个方法调用正确吗
public <T> T SendJsonPrimitiveRequest(String methodName, Object param) { return null; }
我如何限制这个泛型方法只接受可以从字符串强制转换的类型参数
- GetValue应该用于检索int、double、bool和string值,这在C#中使用Convert非常有效。改变类型(…); 这对于Java是可能的,还是我必须编写诸如GetBool()、GetInt()和李>
# 1 楼答案
您需要给Java方法更多的帮助,因为您通常无法从该方法中找到
T
。通常的做法是使用一个额外的参数:这样,您就可以在执行时查看
clazz
,以便执行适当的转换关于其他问题:
您将无法使用基本类型作为类型参数,尽管您可以使用自动取消装箱:
我不知道
Convert.ChangeType
的直接等价物,尽管可能有一些与bean相关的库可以提供帮助。事实上,Spring's转换库通常对您有用我同意mdma的总体结论:将您的许多方法作为特例处理可能更简单;我猜想Java泛型不仅会帮助您,还会阻碍您
# 2 楼答案
不幸的是,Java没有一个内置接口来描述从字符串的转换。最接近的是某些对象在构造函数中采用字符串,或者具有valueOf(String)静态方法。由于没有接口来声明此功能,因此不可能使用泛型将类型限制为可以从字符串构造的对象
您可以将泛型与装箱类型一起使用以提供单个GetValue方法,但它还要求您传入要检索的类型的对应类,例如
不太漂亮,再加上缺乏一种从字符串构造对象的好方法,创建单独的getInt()、getBool()方法可能是最简单的(而且更高效,不需要装箱)