variable - java interface用途




在Java中將接口類作為參數傳遞 (5)

IMO如果你這樣做會更乾淨:

public void sendNotification( IMech mechanism ){
}

您始終可以在方法中獲取類。

我有一個界面:

public interface IMech {

}

以及實現它的類

public class Email implements IMech {

}

以及實現此方法的第三個類:

public void sendNotification( Class< IMech > mechanism ){
}

現在我試圖像這樣調用這種方法

foo.sendNotification(Email.class);

但我一直有例外說:

The method sendNotification(Class<IMech>) in the type RemediationOperator is not applicable for the arguments (Class<Email>)

如果它接口那個類,這不應該工作嗎?


也許你需要

public void sendNotification( Class<? extends IMech> mechanism ) { 

您的參數機制需要使用有界通配符,如下所示:

public void sendNotification(Class <?extends IMech> mechanism){}

引用泛型教程鏈接文本

通常,如果Foo是Bar的子類型(子類或子接口),並且G是某種泛型類型聲明,則不是G是G的子類型的情況。


接口背後的想法是你不需要知道它是哪一個。 您應該只需傳入IMech並調用其功能,無論實現如何。 考慮以下:

public interface IMech {
    void sendMessage();
}

public class Email implements IMech {
    @Override
    void sendMessage() { /* stuff here to send email */ }
}

這是界面的典型使用模式。 如果您只是將它用作選項,也許您應該考慮使用枚舉。

enum IMech { EMAIL, INSTANT_MESSAGE, SNAIL_MAIL, YELL_OVER_CUBICLE }

public void sendNotification( IMech mechanism ){
    switch(mechanism) {
        case IMech.EMAIL: // do email .. etc
    }
}

foo.sendNotification(IMech.EMAIL);

現在我知道這些並不直接回答你的問題,但這些是典型的使用形式,通常表明設計模式更具適應性。 畢竟,你真的需要發送一個類對象嗎? 如果您只是確定使用哪種機制,那麼枚舉似乎更合適。


泛型在Java中不起作用。 您真正需要做的是將方法簽名更改為

public void sendNotification( Class< ? extends IMech > mechanism ){
}

或者是super而不是extends ...讓我參考Effective Java的泛型章節 ......

編輯:有效的Java說:

這是一個助記符,可以幫助您記住要使用的通配符類型: PECS代表producer-extends,consumer-super。

我假設這將生成IMech實例,並且extends是正確的。





interface