簡體   English   中英

如何在通用 class 中強制返回值類型?

[英]How to force type on return value in a generic class?

假設我有一個通用的 class:

public final  class MyClass<T> {
    private List<T> list;

    public MyClass(){

    }
}

兩個問題:

我也想強制用戶創建通用返回類型,這就是我創建通用 class 的原因,但顯然他可以這樣做:

MyClass item = new MyClass();

還有這個:

MyClass item = new MyClass<Customer>();

我想強制開發人員使用他們提供的相同類型來定義他們的返回類型,這樣他們就只能這樣做:

MyClass<Customer> item= new MyClass<Customer>();

這個 class 的目的是在構造函數中獲取一個類型,比方說 class Customer ,並創建該類型的通用列表,但由於返回 object 在應用程序層之間傳遞,我想強制它具有簽名MyClass<Customer>因此很容易理解它包含的列表類型。

正如評論中已經提到的,出於向后兼容的原因,generics 不是強制的。

如果您要求類型 class 作為構造函數參數,您的開發人員將不得不考慮一個類型:

private static class MyClass<T> {
    private List<T> list;

    public MyClass(Class<T> clazz){

    }
}

public static void main(String args[])
{
    MyClass myclass=new MyClass(Object.class);
}

但如你所見,他們總能通過 Object:)

這個 class 的目的是在構造函數中獲取一個類型,比方說 class Customer,並創建該類型的通用列表......

不,作為MyClass的開發者,您不需要這個。 您可以在代碼中安全地執行類似的操作(這與調用者是否使用原始MyClass類型無關):

public final  class MyClass<T> {
    private List<T> list;

    public MyClass(){
        this.list = new ArrayList<>();
    }
}

除了 Java 出於好的(和實際的)原因允許這樣做之外,您的類型參數不受限制只是表明您自己也不太關心(當使用MyClass而不是MyClass<Something>時,Java 默認使用Object )。

但是,如果您要查找的是基於類型的動態行為,例如動態實例化元素,那么最好是從調用者那里獲取 class 實例本身:

public final  class MyClass<T> {
    private Class<T> type;
    private List<T> list;

    public MyClass(Class<T> type){
        this.type = type;
        this.list = new ArrayList<>();
    }

    //then use type to perform your dynamic behavior on the element type
}

這將迫使您的調用者發送一個類型,因此使他們使用原始類型幾乎毫無意義。 但是你也應該有這樣做的理由。

暫無
暫無

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

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