[英]Override methods with different generic types
我有以下课程:
public class A extends Exception {
}
public class B extends Email {
}
我的目标是实施一些策略,使其能够与以下两个类一起使用:
例如:
public enum Strategy {
ACTION_1 {
@Override
public void handleAction(Class<? extends Exception > parameterThatShouldAcceptOnlyA) {
throw parameterThatShouldAcceptOnlyA;
}
},
ACTION_2 {
@Override
public void handleAction(Class<? extends Email > parameterThatShouldAcceptOnlyB) {
parameterThatShouldAcceptOnlyB.send();
}
};
public abstract void handleAction(Class<?> parameterThatShouldAcceptBoth);
}
这不是通过覆盖方法中不正确的泛型编译的。
您能否建议如何使其可行?
你最好回到这里。 您的想法完全违反了Liskov替代原则 。
基本上,您想限制可以作为方法的参数传递的子类。
这打破了可以使用子类代替其超类的整个想法。 因为现在突然之间,想要调用该方法的代码必须检查它所调用的对象的类型-以确保不使用“无效”参数来调用该方法。
换句话说:将此编译器错误视为症状 。 即使您以某种方式解决特定问题; 如前所述-您最好退后一步,重新思考您的整个想法。
提示 :不能抛出Class
实例,也不能调用Class
提供的其他方法,因此,首先需要更改参数类型。 这也使您可以删除通配符。
您可以通过泛型定义超类。 不幸的是,枚举不支持泛型。 但是您可以创建一个通用接口,例如
interface Handler<T> {
void handleAction(T t);
}
并像这样实现您的处理程序
class EmailHandler implements Handler<Email> {
void handleAction(Email email) {
email.send();
}
class ExceptionHandler implements Handler<Exception> {
void handleAction(Exception e) {
// Exception is a checked exception
// so we cannot throw it without 'throws' declaration
// but we cannt add 'throws Exception'
if (e instanceof RuntimeException)
throw (RuntimeException) e;
else
throw new RuntimeException("wrapped", e);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.