有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

如何将这些通用方法调用从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()和

共 (2) 个答案

  1. # 1 楼答案

    您需要给Java方法更多的帮助,因为您通常无法从该方法中找到T。通常的做法是使用一个额外的参数:

    public <T> T sendJsonPrimitiveRequest(String methodName,
                                          Object param,
                                          Class<T> clazz)
    

    这样,您就可以在执行时查看clazz,以便执行适当的转换

    关于其他问题:

    • 不,不能将type参数限制为可以从字符串转换的类型(在C#或Java中)
    • 您将无法使用基本类型作为类型参数,尽管您可以使用自动取消装箱:

      int x = sendJsonPrimitiveRequest("foo", param, Integer.class);
      
    • 我不知道Convert.ChangeType的直接等价物,尽管可能有一些与bean相关的库可以提供帮助。事实上,Spring's转换库通常对您有用

    我同意mdma的总体结论:将您的许多方法作为特例处理可能更简单;我猜想Java泛型不仅会帮助您,还会阻碍您

  2. # 2 楼答案

    不幸的是,Java没有一个内置接口来描述从字符串的转换。最接近的是某些对象在构造函数中采用字符串,或者具有valueOf(String)静态方法。由于没有接口来声明此功能,因此不可能使用泛型将类型限制为可以从字符串构造的对象

    您可以将泛型与装箱类型一起使用以提供单个GetValue方法,但它还要求您传入要检索的类型的对应类,例如

      T <T> getValue(String methodName, Object param, Class<T> type)
    

    不太漂亮,再加上缺乏一种从字符串构造对象的好方法,创建单独的getInt()、getBool()方法可能是最简单的(而且更高效,不需要装箱)