[英]Interface method taking same implementation of interface
我有以下界面:
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
定義為其自己的類。
我認為您的設計中存在一個缺陷,會引起問題。 根據您提供的內容,似乎ClusterPopulation應該是一個類,而不是接口。 讓我們看看這種方法,
public double computeDistance(ClusterPopulation other);
這是什么意思? 這意味着將類型為ClusterPopulation的對象傳遞給此方法。 此外,該對象必須具有一些屬性,否則,如何計算距該對象的距離? 結合這兩個觀察結果,可以得出結論,ClusterPopulation應該是一個類,以便具有該類型的對象。 當我說一堂課時,它可以是具體的或抽象的。 讓我們以抽象類為例。
public abstract class ClusterPopulation
{
// common attributes, if any
abstract public double computeDistance();
}
public class A extends ClusterPopulation {
public double computeDistance() {
// do some computation based on ClusterPopulation attributes
}
}
public class B extends ClusterPopulation {
public double computeDistance() {
// do computation based on ClusterPopulation attributes
}
}
現在,您將以這種方式使用它:
ClusterPopulation a = new A();
ClusterPopulation b = new B();
double aResult = a.computeDistance();
double bResult = b.computeDistance();
請注意,此處要求您執行限制。 盡管a和b都是ClusterPopulation類型的對象, 但是computeDistance()僅適用於調用對象的具體類型。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.