我有以下界面:
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
定义为其自己的类。