1

我是 Java 新手,我需要在 Java6 中编写一个通用方法。我的目的可以用下面的 C# 代码来表示。有人可以告诉我如何用 Java 编写它吗?

class Program
{
    static void Main(string[] args)
    {
        DataService svc = new DataService();
        IList<Deposit> list = svc.GetList<Deposit, DepositParam, DepositParamList>();
    }
}

class Deposit { ... }
class DepositParam { ... }
class DepositParamList { ... }

class DataService
{
    public IList<T> GetList<T, K, P>()
    {
        // build an xml string according to the given types, methods and properties
        string request = BuildRequestXml(typeof(T), typeof(K), typeof(P));

        // invoke the remote service and get the xml result
        string response = Invoke(request);

        // deserialize the xml to the object
        return Deserialize<T>(response);
    }

    ...
}
4

2 回答 2

3

因为泛型是 Java 中仅编译时的特性,所以没有直接的等价物。 typeof(T)根本不存在。java 端口的一种选择是让方法看起来更像这样:

public <T, K, P> List<T> GetList(Class<T> arg1, Class<K> arg2, Class<P> arg3)
{
    // build an xml string according to the given types, methods and properties
    string request = BuildRequestXml(arg1, arg2, arg3);

    // invoke the remote service and get the xml result
    string response = Invoke(request);

    // deserialize the xml to the object
    return Deserialize<T>(response);
}

这样,您需要调用者以使类型在运行时可用的方式编写代码。

于 2012-11-09T05:52:56.073 回答
1

几个问题
- A. Java 中的泛型比 C# 中的“弱”。
没有"typeof,所以你必须传递代表typeof的类参数
。B。你的签名还必须在泛型定义中包含K和P。
所以代码看起来像:

public <T,K,P> IList<T> GetList(Class<T> clazzT, Class<K> claszzK,lass<P> clazzP) {
    String request = buildRequestXml(clazzT, clazzK, clazzP);
    String response = invoke(request);
    return Deserialize(repsonse);
}
于 2012-11-09T05:57:02.583 回答