我有以下界面:

public interface ClusterPopulation
{
    public double computeDistance(ClusterPopulation other);
}


是否可以在接口本身中指定ClusterPopulation的实现A只能将A实现作为computeDistance的参数?

我看到的唯一可解决的解决方案如下,但我不喜欢它:

用泛型重新定义接口:

public interface ClusterPopulation
{
    public <T extends ClusterPopulation> double computeDistance(T other);
}


在实现内,如果参数不是来自良好类型,则抛出IllegalArgumentException;如果类型正常,则进行一些强制转换... Meeeeh!

即使采用这种方法,最终用户也只能通过阅读文档/查看代码实现/尝试和错误来了解约束条件...

有更好的解决方案吗?

最佳答案

使用泛型您有正确的主意,但不要将其应用于方法,而应将其应用于整个接口。

public interface ClusterPopulation<T extends ClusterPopulation<T>>
{
    double computeDistance(T other);
}


这允许实现将T定义为自身。

public class ClusterPopulationA implements ClusterPopulation<ClusterPopulationA> {  // ...


但是,这并不禁止将其定义为其他实现。

public class BreaksPattern implements ClusterPopulation<ClusterPopulationA>


在文档中包括所有子类都应将类型参数T定义为其自己的类。

09-05 13:45