簡體   English   中英

接口方法采用與接口相同的實現

[英]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();

請注意,此處要求您執行限制。 盡管ab都是ClusterPopulation類型的對象, 但是computeDistance()僅適用於調用對象的具體類型。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM