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> { ... }

両方SimpleResourceDescriptorLabelsCommentsResourceDescriptor拡張

public abstract class ComparableResourceDescriptor
             implements ResourceDescriptor 

実行時に、メソッドを呼び出します

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

これは、ResourceDescriptor の特定のインスタンスに依存する ISimmilarityMeasure のインスタンス「sim」を返します。

ResourceDescriptor[] candidatesまた、実行時に、特定の ISimmilarityMeasure オブジェクトに必要な 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 であるため、呼び出しを許可することをコンパイラーに明確にすべきではないでしょうか? 特定の ISimmilarityMeasure が特定のタイプの ResourceDescriptor を期待しているが、別のタイプが渡された場合、実行時に例外になるべきではありませんか?

4

1 に答える 1

2

getSimInstance()ISimmilarityMeasure<X>は、ある typeの type のオブジェクトを返しますX。私たちが知っているのXは、それが から継承されているということだけResourceDescriptorです。このオブジェクトで、 を呼び出しますgetSim(ResourceDescriptor, ResourceDescriptor)。ただし、パラメーターを期待しているのではなくResourceDescriptor、パラメーターを期待していXます。

anXは常に a ですが、 aが a であるResourceDescriptorという保証はありません。したがって、コンパイラはそれを受け入れることを拒否します。ResourceDescriptorX

于 2013-08-13T15:12:51.133 に答える