我目前遇到以下问题:
我有一个Mutation
对象,其中包含以下字段:id
和tableName
。该对象表示MySQL服务器的更改,在name = tableName
和row_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,但我认为这可以用更少的代码来完成。
答案 0 :(得分:1)
我担心为了使其正常工作,您将不得不引入一个名为Table<T>
的新实体,其中T
参数是该行的类。因此,您将拥有Table<Product>
和Table<ProductVariant>
。
然后,您需要将Table<T> table
作为第一个参数传递给doGet()
方法,因此结果将是类型安全的。您的基于反射的stringly-typed方法很可爱,但它不起作用,因为它不提供编译时类型信息。