java - 有界类作为参数

标签 java generics bounded-types

我对有界类感到疯狂......

我定义了这样一个方法:

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");

您还可以传入一个对象而不是一个类,它可以“携带”通用参数:

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));

JavaType 可能如下所示:

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>然后可以用普通的类、列表或任何你需要的东西来扩展类。如果您需要反射,它甚至可以携带必要的类对象。

关于java - 有界类作为参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35246224/

相关文章:

java - 填充Object[]数据

java - 如何从父泛型引用子泛型?

c# - 通用 OrderedDictionary : How to get an index of a key?

java - 是否可以有一个类型参数扩展另外 2 个类型参数?

java - 你能帮我打印一个用二叉搜索树制作的家谱吗?

java - 尝试确定字符串是否为整数

java - Spring 3.1 或更高版本 @RequestMapping 消费/生产

c# - 类型转换的通用方法

java - Java 中的有界类型

c# - 方法参数 C# 中的有界泛型类型