2

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

我有以下类层次结构:(WeightedThing<T>只是为某些随机类型添加权重)和一个自定义VectorWeightedVector(不,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 的 Mac OS X 的 jdk7u10 编译它会失败)。也不用 . 调用相同的函数Vector。我可以通过添加向上转换来强制它编译Object,但这看起来很可怕。

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

4

2 回答 2

3

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

public <T extends Vector> List<WeightedThing<T>> search(T vector, int limit) {...}
于 2012-10-28T13:31:03.597 回答
0

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

 List<WeightedThing<WeightedVector>> neighbors = (List<WeightedThing<WeightedVector>>)
                                                (List<?>)search(query, 1);
于 2012-10-28T12:18:22.653 回答