簡體   English   中英

Java - 在接口/抽象方法上將類擴展為返回類型

[英]Java - extending class as return type on interface/abstract method

我試圖找到一種方法來創建一個接口/抽象方法,聲明/擴展類作為返回類型。 (例如,classA擴展了interfaceA,該方法應該返回一個ClassA對象)。

現在我發現一些帖子,編譯器不會抱怨類似的東西,但JVM無法處理這樣的事情,這意味着這個機制在java中不存在。

所以我提出了以下想法,我不知道它是否在技術上足夠省錢。 (例如它會導致循環)

public interface ISomeInterface<T extends ISomeInterface<T>> {
    public T get();
}

意思是你可以這樣使用它。 雖然這並沒有強迫外部用戶使用擴展類,但如果首選,它至少有機會這樣做:

public class ExtendingClass implements ISomeInterface<ExtendingClass>{
    @Override
    public ExtendingClass get(){}
}

現在這沒有給出編譯器或運行時錯誤,但我擔心如果廣泛使用會產生任何問題。

如果有人能夠確認這會導致或不會導致問題,我將不勝感激。 (歡迎任何其他反饋)。

這沒什么不對。 這實際上是一種相當普遍的做法。

這是一種非常普遍的做法。 例子包括:

Enum<E extends Enum<E>>

BaseStream<T, S extends BaseStream<T, S>>

但是,請確保您了解這些限制。 主要的一點是它不能很好地繼承。

例如,如果您有一個界面

interface Animal<A extends Animal<A>>

您可以決定編寫這樣的具體實現

class Duck implements Animal<Duck>

這樣可以正常工作,但是如果你以后決定要擴展Duck ,你將無法寫下這個:

class MallardDuck extends Duck implements Animal<MallardDuck>

你不能這樣做的原因是你不能用兩個不同的類型參數實現相同的通用接口 - 因為Duck已經實現了Animal<Duck> ,所以MallardDuck不可能實現Animal<MallardDuck>

因此,請確保如果您使用此模式,則需要非常仔細地考慮如何實現接口。 它適用於Enum因為該語言不允許您擴展它們,但如果使用太多,這種模式可能會造成一團糟。

暫無
暫無

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

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