我有一个界面:
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>)
如果它接口那个类,这不应该工作吗?
答案 0 :(得分:48)
也许你需要
public void sendNotification( Class<? extends IMech> mechanism ) {
答案 1 :(得分:10)
因为两个类Class<IMechanism>
和Class<EmailNotification>
本身不与继承相关,即使IMechanism
和EmailNotification
< /强>
您需要让方法接受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 ){
}
您始终可以在方法内获取课程。