[英]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>
本身並非由相關的繼承,即使IMechanism
和EmailNotification
是 。
你需要讓你的方法接受一個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.