具有嵌套泛型的不可转换类型

时间:2012-10-28 12:16:59

标签: java nested-generics

我查看了其他类似Java的泛型问题,我仍然感到困惑。

我有以下类层次结构:WeightedThing<T>(只是为某些随机类型添加权重)和自定义Vector类,其中WeightedVector(不,WeightedVector为不只是WeightedThing<Vector>)是一个子类。

我想进行最近邻搜索并返回给定查询向量及其距离的最近向量列表。为此,我定义了search方法:

public List<WeightedThing<? extends Vector>> search(Vector, int limit) {...}
希望我能做到

List<WeightedThing<WeightedVector>> neighbors = (List<WeightedThing<WeightedVector>>)search(query, 1);

这不起作用(IntelliJ没有将其标记为错误,但是使用Sun的jdk7u10将其编译为Mac OS X失败)。也没有使用Vector调用相同的函数。 我可以通过向Object添加一个upcast来强制它进行编译,但这看起来很糟糕。

这样做的目的是我可以搜索和添加任何类型的向量,但如果我知道我只添加了WeightedVectors,我想将结果反馈给WeightedVectors。

2 个答案:

答案 0 :(得分:3)

通常,在方法的返回类型中使用wild char类型不是一个好习惯。为什么不尝试更改方法签名,如下所示:

public <T extends Vector> List<WeightedThing<T>> search(T vector, int limit) {...}

答案 1 :(得分:0)

WeightedThing<? extends Vector>列表与WeightedThing<WeightedVector>列表不同。要进行类型转换,它会转换为any collection的野生字符类型,然后转换为特定类型。

 List<WeightedThing<WeightedVector>> neighbors = (List<WeightedThing<WeightedVector>>)
                                                (List<?>)search(query, 1);