2016-12-16 77 views
1

我使用它包含一个方法的外部库的参数:泛型 - 在类型的方法并不适用于

public <V> List<V> getObjectsForHashCriteria(@NonNull final Class<V> clazz,  @NonNull final V hashObject) { 
final DynamoDBQueryExpression<V> queryExpression = new  DynamoDBQueryExpression<V>().withHashKeyValues(hashObject); 
return dynamoDBMapper.query(clazz, queryExpression, 
      dynamoDBMapperConfig); 
} 

我想调用上述方法。为了获得类对象,我将它传递给构造函数。事情是这样的:

MyClass(final @NonNull Class<T> clazz){ 
this.clazz = clazz} 

中序调用getObjectsForHashCriteria(),我目前做这件事,如下图所示,但它显示编译错误:

public <T> List<T> fetchObjectsForHashCriteria(@NonNull final T hashObject){ 
instance.getObjectsForHashCriteria(clazz, hashObject); 
} 

但它显示了一个编译错误:

getObjectsForHashCriteria(Class,V)方法不适用于 的参数(Class,T)。

所以基本上我试图通过泛型类型参数作为泛型类型参数。请让我知道这是什么问题?如果这是不可能的,是否有任何解决方法?

+3

你有两个不同的'T'仿制药,你掩盖了类级别(如果它是类级),一般用新的''对不起 – Rogue

+0

,我没有明白你的观点。你能否澄清一点? –

+1

当你在你的方法中声明'列表'时,你声明了一个类型为'T'的类型见证。这个'T'(在'#fetchObjectsForHashCriteria'方法上)与你构造函数中的'Class '有着根本的区别。 – Rogue

回答

3

你没有显示你的完整的类MyClass,但我相信它看起来像这样:

public class MyClass<T> { 
    private final Class<T> clazz; 
    // ... 

    MyClass(final @NonNull Class<T> clazz) { 
     this.clazz = clazz; 
    } 

    public <T> List<T> fetchObjectsForHashCriteria(@NonNull final T hashObject) { 
     instance.getObjectsForHashCriteria(clazz, hashObject); 
    } 
} 

有什么不对的:fetchObjectsForHashCriteria有其自己的类型参数T这是从类型参数分离的方法TMyClass,即使他们都碰巧被命名为T

删除该方法的类型参数T;让它使用T从类改为:

// Note: no <T> type parameter 
public List<T> fetchObjectsForHashCriteria(@NonNull final T hashObject) { 
    instance.getObjectsForHashCriteria(clazz, hashObject); 
} 
+0

你太棒了!所以我现在明白了,使用是使它成为另一种通用类型。我花了很多时间试图弄清楚这一点。谢谢! –