Java:通用接口,在运行时选择实例
我有以下简单的界面:Java:通用接口,在运行时选择实例,java,generics,wildcard,bounded-wildcard,Java,Generics,Wildcard,Bounded Wildcard,我有以下简单的界面: public interface ISimmilarityMeasure<T extends ResourceDescriptor> { public double getSim(T s, T t); } 在运行时,我调用该方法 public static ISimmilarityMeasure<? extends ResourceDescriptor> getSimInstance(){ } 我使用eclipse,如果我查看sim可用的
public interface ISimmilarityMeasure<T extends ResourceDescriptor> {
public double getSim(T s, T t);
}
在运行时,我调用该方法
public static ISimmilarityMeasure<? extends ResourceDescriptor> getSimInstance(){ }
我使用eclipse,如果我查看sim可用的方法,它会显示getSim(null s,null t)
。
我不明白为什么会这样。如果编译器不清楚,getSim必须期望任何ResourceDescriptor,并且候选对象中的每个对象都是ResourceDescriptor,因此允许调用?如果特定的ISimmilarityMeasure需要某种类型的ResourceDescriptor,但却得到了另一种类型的ResourceDescriptor,那么在运行时这不应该是一个异常吗?getSimInstance()
将为某些类型的X
返回一个类型为ISimmilarityMeasure
的对象。关于X
我们只知道它继承自ResourceDescriptor
。在这个对象上,您可以调用getSim(ResourceDescriptor,ResourceDescriptor)
。但是,它不需要ResourceDescriptor
参数,它需要X
参数
虽然X
始终是ResourceDescriptor
,但不能保证ResourceDescriptor
是X
,因此编译器拒绝接受它。您能展示一些实际的代码流吗。现在你说的话在我脑子里都混了。我找不到所有的。首先,我无法理解外面的sim()
的实际签名。您已经向我们展示了3.由于接口ISimmilarityMeasure是通用的,因此getSim(..)的签名也是通用的。例如,在接口中是getSim(ts,tt),在normalizedLeventheinsim中是getSim(SimpleResourceDescriptor s,SimpleResourceDescriptor T)。“sim”是ISimmilarityMeasure的一个实例。在运行时选择特定的实现(例如,normalizedLeventheinsim或JaccardCommentsSim)。我承认,这有点令人困惑:)嗯,我说的是返回类型。在接口中,你有“代码>双< /代码>,然后在中间它是代码> iimMILARITY测量。对不起,这只是一个错误的命名——中间的一个(我把它命名为‘GesiMistStand’)是一个静态工厂方法来获得一个实现。code>double-getSim(ts,Tt)
是接口的实际计算方法。好的,我理解。是否有一个好的替代方法来替代我正在尝试的操作,或者我是否应该参数化,例如,使用getSim()方法并在其中执行SimpleResourceDescriptor的实例检查?
public class JaccardCommentsSim implements
ISimmilarityMeasure<LabelsCommentsResourceDescriptor> { ... }
public abstract class ComparableResourceDescriptor
implements ResourceDescriptor
public static ISimmilarityMeasure<? extends ResourceDescriptor> getSimInstance(){ }
"capture#3-of ? extends ResourceDescriptor ... is not applicable for the arguments (ResourceDescriptor ... "