在Java中将接口类作为参数传递

时间:2010-05-18 17:35:22

标签: java interface

我有一个界面:

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

如果它接口那个类,这不应该工作吗?

7 个答案:

答案 0 :(得分:48)

也许你需要

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

答案 1 :(得分:10)

因为两个类Class<IMechanism>Class<EmailNotification>本身与继承相关,即使IMechanismEmailNotification < /强>

您需要让方法接受Class<? extends IMechanism>

答案 2 :(得分:5)

您的参数机制需要使用有界通配符,如下所示:

public void sendNotification(Class&lt;?extends IMech&gt; mechanism){ }

引用泛型教程link text

  

通常,如果Foo是子类型   Bar的子类或子接口,和   G是一些泛型类型声明,它   G不是一个例子   G的子类型。

答案 3 :(得分:3)

泛型在Java中不起作用。您真正需要做的是将方法签名更改为

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

或者是super而不是extends ...让我参考Effective Java的Generics chapter ...

编辑: 有效的Java说:

  

这是一个帮助你的助记符   记住要使用的通配符类型:    PECS代表生产者延伸,消费者超级。

我假设这将生成IMech实例,而extends是正确的。

答案 4 :(得分:3)

正确的方法是:

public void sendNotification(IMech mechanism) {

}

所以请阅读一些关于每个人界面的java教程!

答案 5 :(得分:1)

接口背后的想法是你不需要知道它是哪一个。您应该只需传入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);

现在我知道这些并不直接回答你的问题,但这些是典型的使用形式,通常表明设计模式更具适应性。毕竟,你真的需要发送一个类对象吗?如果你只是确定使用哪种机制,那么枚举似乎更合适。

答案 6 :(得分:1)

IMO如果你这样做会更干净:

public void sendNotification( IMech mechanism ){
}

您始终可以在方法内获取课程。