1

我有以下简单的界面:

public interface ISimmilarityMeasure<T extends ResourceDescriptor> {
    public double getSim(T s, T t);
}

和像这样的实现

public class NormalizedLevenstheinSim implements
             ISimmilarityMeasure<SimpleResourceDescriptor> { ... }

public class JaccardCommentsSim implements
             ISimmilarityMeasure<LabelsCommentsResourceDescriptor> { ... }

SimpleResourceDescriptor和扩展LabelsCommentsResourceDescriptor_

public abstract class ComparableResourceDescriptor
             implements ResourceDescriptor 

在运行时,我调用该方法

public static ISimmilarityMeasure<? extends ResourceDescriptor> getSimInstance(){ }

这将返回一个依赖于 ResourceDescriptor 特定实例的 ISimilarityMeasure 实例“sim”。

我还创建了一个数组ResourceDescriptor[] candidates,它将在运行时保存特定 ISimilarityMeasure 对象所需的 ResourceDescriptor 类型的实例。

但是,如果我尝试调用sim.getSim(candidates[0], candidates[1])编译器会告诉我

"capture#3-of ? extends ResourceDescriptor ... is not applicable for the arguments (ResourceDescriptor ... "

我使用 eclipse,如果我查看 sim 的可用方法,它会告诉我getSim(null s, null t). 我不明白为什么会这样。编译器是否应该不清楚 getSim 必须期待任何 ResourceDescriptor 并且其中的每个对象candidates都是 ResourceDescriptor 并因此允许调用?如果特定的 ISimilarityMeasure 需要某种类型的 ResourceDescriptor 但被交给了不同的 ResourceDescriptor,那么它在运行时不应该是一个例外吗?

4

1 回答 1

2

getSimInstance()将返回ISimmilarityMeasure<X>某种类型的对象X。我们所知道X的是它继承自ResourceDescriptor. 在这个对象上,你调用getSim(ResourceDescriptor, ResourceDescriptor). 但是,它不期望ResourceDescriptor参数,而是期望X参数。

虽然 anX始终是 a ResourceDescriptor,但不能保证 aResourceDescriptor是 an X,因此您的编译器拒绝接受它。

于 2013-08-13T15:12:51.133 回答