有界 class 作为参数
Bounded class as parameter
我对有界的车感到疯狂class...
我定义了这样一个方法:
protected <X> DataAccessResult<List<X>> executeQuery(final String query, final Class<X> elementType,Object... args)
我想用以下参数调用它:
查询:一个 SQL 查询,它实际上做什么并不重要
elementType :我需要像 Map<String,Object>.class
这样的东西,因为我需要得到的是 DataAccessResult<List<Map<String,Object>>>
但是 Map<String,Object>.class
无法编译,并且 Map.class
不允许我将 DataAccessResult<List<Map<String,Object>>>
作为结果类型。
我的意思是:
DataAccessResult<List<Map>> x = executeQuery("Select * from table",Map.class, (Object[]) null);
DataAccessResult<Map<String,Object>>> y = (DataAccessResult<Map<String,Object>>>) x;
引发施法错误
DataAccessResult<List<Map<String,Object>>> x = executeQuery("Select * from table",Map.class, (Object[]) null);
也不起作用..
正确的语法是什么?
谢谢!
简答:你做不到。至少不是在正常的 Java 语法中。但是有一些解决方法。
第一个是,你只需在调用方明确指定 X
这样:
protected <X> DataAccessResult<List<X>> executeQuery(final String query, Object... args)
this.<Map<String, Object>>executeQuery("Select * from table");
您还可以传入一个 对象 而不是 class,它可以 "carry" 通用参数:
protected <X> DataAccessResult<List<X>> executeQuery(final String query, X prototype, Object... args)
executeQuery("Select * from table", new Map<String, Object>());
这两个都不需要额外的工作,但公认的笨拙。第三个选项是引入 Class<T>
构造的替代品,它可以携带通用参数。这将是这样的词:
protected <X> DataAccessResult<List<X>> executeQuery(final String query, JavaType<X> type, Object... args)
executeQuery("Select * from table", map(String.class, Object.class));
其中 Java类型可能如下所示:
public class JavaType<T> {
public static <K, V> JavaType<Map<K, V>> map(Class<K> keyType, Class<V> valueType) {
new JavaType<Map<K, V>>();
}
}
这个 JavaType<T>
class 然后可以用正常的 classes、列表、任何你需要的扩展。如果您需要它们进行反射,它甚至可以携带必要的 class 对象。
我对有界的车感到疯狂class...
我定义了这样一个方法:
protected <X> DataAccessResult<List<X>> executeQuery(final String query, final Class<X> elementType,Object... args)
我想用以下参数调用它:
查询:一个 SQL 查询,它实际上做什么并不重要
elementType :我需要像 Map<String,Object>.class
这样的东西,因为我需要得到的是 DataAccessResult<List<Map<String,Object>>>
但是 Map<String,Object>.class
无法编译,并且 Map.class
不允许我将 DataAccessResult<List<Map<String,Object>>>
作为结果类型。
我的意思是:
DataAccessResult<List<Map>> x = executeQuery("Select * from table",Map.class, (Object[]) null);
DataAccessResult<Map<String,Object>>> y = (DataAccessResult<Map<String,Object>>>) x;
引发施法错误
DataAccessResult<List<Map<String,Object>>> x = executeQuery("Select * from table",Map.class, (Object[]) null);
也不起作用..
正确的语法是什么?
谢谢!
简答:你做不到。至少不是在正常的 Java 语法中。但是有一些解决方法。
第一个是,你只需在调用方明确指定 X
这样:
protected <X> DataAccessResult<List<X>> executeQuery(final String query, Object... args)
this.<Map<String, Object>>executeQuery("Select * from table");
您还可以传入一个 对象 而不是 class,它可以 "carry" 通用参数:
protected <X> DataAccessResult<List<X>> executeQuery(final String query, X prototype, Object... args)
executeQuery("Select * from table", new Map<String, Object>());
这两个都不需要额外的工作,但公认的笨拙。第三个选项是引入 Class<T>
构造的替代品,它可以携带通用参数。这将是这样的词:
protected <X> DataAccessResult<List<X>> executeQuery(final String query, JavaType<X> type, Object... args)
executeQuery("Select * from table", map(String.class, Object.class));
其中 Java类型可能如下所示:
public class JavaType<T> {
public static <K, V> JavaType<Map<K, V>> map(Class<K> keyType, Class<V> valueType) {
new JavaType<Map<K, V>>();
}
}
这个 JavaType<T>
class 然后可以用正常的 classes、列表、任何你需要的扩展。如果您需要它们进行反射,它甚至可以携带必要的 class 对象。