创建用于将对象转换为特定方法的通用函数

时间:2015-05-18 14:26:24

标签: java generics

我目前遇到以下问题:

我有一个Mutation对象,其中包含以下字段:idtableName。该对象表示MySQL服务器的更改,在name = tableNamerow_id = id的表中。现在,我想翻译'此对象向服务器发出新请求。有了这个请求,我想从服务器获取更新的对象(具有该id,并且是表中包含该tableName的行)。我已经构建了以下方法来执行请求:

public <T> List<T> doGet(Class<T[]> clazz, List<Parameter> parameters) throws Exception {

    StringBuilder URL = new StringBuilder(baseURL);
    String tableName = (String) clazz.getComponentType().getDeclaredField("tableName").get(null);

    URL.append(tableName+"/get");

    ...

    T[] objectsArray = new Gson().fromJson(json, clazz);

    return Arrays.asList(objectsArray);
}

此方法工作正常,只返回类型T的列表。但我想将此方法与变量输入一起使用。

我现在已经构建了一个方法,为每个tableName返回正确的Class

public static <T> Class<T> tableNameToClass(String tableName) {

    if (tableName.equals("product")) {
        return Product[].class;
    }
    else if (tableName.equals("product_variant")) {
        return ProductVariant[].class;
    }
    //etc....

    return null;
}

但这不起作用,(无法将Class转换为Class)所以我假设我不理解正确使用泛型。

另一个问题是当doGet()方法有效时,我不知道如何将此方法的返回值转换为正确的List类型。

List<SomeType> updatedObjects = doGet();

但是在这里,SomeType是可变的,如果可能的话,我不知道如何让它一般地工作。我也可以用我Class的每一个构建一个巨大的if-else,但我认为这可以用更少的代码来完成。

1 个答案:

答案 0 :(得分:1)

我担心为了使其正常工作,您将不得不引入一个名为Table<T>的新实体,其中T参数是该行的类。因此,您将拥有Table<Product>Table<ProductVariant>

然后,您需要将Table<T> table作为第一个参数传递给doGet()方法,因此结果将是类型安全的。您的基于反射的stringly-typed方法很可爱,但它不起作用,因为它不提供编译时类型信息。