我查看了其他类似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。
答案 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);