2014-04-01 38 views
1

我有这样的方法泛型作为Java中的泛型类型?

static public <K> float calculateSimilarity(HashMap<K, Float> hashMap1, Class<K> clazz) 

在我把这种方法是这样的部分:

HashMap<Pair<Long,Long>,Float> newValues1=....; //A.K.A. K is Pair<Long,Long> type. 

calculateSimilarity(newValue1, Pair.class); // Doesn't work here! 

,其中对被

org.apache.commons.lang3.tuple .Pair

由两个元素组成的一对。

请问在调用calculateSimilarity方法时如何使用Pair.class?因为如果我使用字符串作为K它的工作,但在这里配对它不起作用我得到了错误。

+0

您想告诉我们编译错误是什么,或者我们必须猜测? –

+0

Eclipse只是说“方法XXX不适用于参数XXX”没有别的...... –

回答

3

对于HashMap<Pair<Long, Long>>,输入参数K推断为Pair<Long, Long>。所以你需要通过Class<Pair<Long, Long>>,但你通过Class<Pair>。您需要使用适当的转换:

calculateSimilarity(newValue1, (Class<Pair<Long, Long>>)(Class<?>)Pair.class); 

,因为你不能直接获得使用.class文字所需Class型演员是必需的。

+0

+1有那个链式演员再次。我仍然喜欢它:) – Bohemian

+0

感谢它的工作原理,但它为什么需要首先将Pair.class投射到(Class )? –

+0

@Tyler:因为在可证明不重叠的两种引用类型之间进行投射是非法的。就像没有类型可以是“列表”和“列表”的子类型一样,类型(除了“null”类型)都可以是类<对>和类的子类型。 – newacct