有界类作为参数

时间:2016-02-06 20:42:05

标签: 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);也没有工作..

什么是正确的语法?

谢谢!

1 个答案:

答案 0 :(得分:2)

简短回答:你真的不能这样做。至少不是普通的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>类。如果你需要它们进行反射,它甚至可以携带必要的类对象。