Java将Array传递给泛型方法

时间:2017-09-29 09:24:57

标签: java arrays generics

我有这种通用方法:

public <T> T get(Class<T> type, String... keys)
{
    String key = String.join(".", keys);
    if(this._data.containsKey(key))
        return type.cast(this._data.get(key));

    return null;
}

我需要传递一个通用数组作为类型,但我不明白该怎么做:

public <T extends SearchableItem> ArrayList<T> filterAudio(T[] type, int taxonomyId, TaxonomyLevel level, int count) {
    T[] all = (T[])masterDbManager.get(type, "audiotracks-alphabetic");
    ....
}

但这不起作用,因为get()方法需要一个类:

  

错误:(200,39)java:方法get in class com.xxxxxx.yyyyy.dal.MasterDbManager不能应用于给定的类型;     必需:java.lang.Class,java.lang.String []     found:T [],java.lang.String     原因:无法推断出类型变量(T)       (参数不匹配; T []无法转换为java.lang.Class)

不是数组,所以当我需要检索数组时如何使用get()方法?

希望我的要求很明确:)

编辑:好的我需要.getClass()方法

T[] all = (T[])masterDbManager.get(type.getClass(), dbKey);

但是我现在如何通过以下方法调用filterAudio()方法?

public <T> ArrayList<T> searchAudio(Class<T> type, int taxonomyId, TaxonomyLevel taxonomyLevel, String searchText, int page, int pageSize, SearchOrder order) {
    ArrayList<T> all = filterAudio(???, taxonomyId, taxonomyLevel, 0);
    ...
}

2 个答案:

答案 0 :(得分:0)

在您的具体情况下,您只需撰写(T[])masterDbManager.get(Object.class, "audiotracks-alphabetic")即可,因为无论如何都会将结果转换为T[]

通常,Class类型没有T[]。无论基本类型数组有什么,它始终会Array.class

答案 1 :(得分:0)

你必须将确切类型传递给get方法。如果你的类型是数组,那么你将需要传递类似String [] .class的东西 - 根据提供的签名