簡體   English   中英

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

[英]Passing Interface Class as a Parameter in Java

我有一個界面:

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 ) { 

因為兩個類Class<IMechanism>Class<EmailNotification>本身並非由相關的繼承,即使IMechanismEmailNotification

你需要讓你的方法接受一個Class<? extends IMechanism> Class<? extends IMechanism>

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

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

引用泛型教程鏈接文本

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

正確的方法是:

public void sendNotification(IMech mechanism) {

}

所以請閱讀一些關於各界面的java教程!

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

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

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

編輯:有效的Java說:

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

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

IMO如果你這樣做會更干凈:

public void sendNotification( IMech mechanism ){
}

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

接口背后的想法是你不需要知道它是哪一個。 您應該只需傳入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);

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

暫無
暫無

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

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