我有以下课程:
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);
}
这不是通过覆盖方法中的不正确通用编译的。
您能否建议如何使其可行?
答案 0 :(得分:2)
你最好再回到这里。您的想法违反了Liskov Substitution Principle。
基本上你想要限制一个子类,它可以作为方法的参数传入。
这打破了可以使用子类代替超类的整个想法。因为现在,突然之间,想要调用该方法的代码必须检查它正在调用的对象的类型 - 以确保不调用该方法“无效”参数。
换句话说:将此编译器错误作为症状。即使你以某种方式解决具体问题;如上所述 - 你最好退后一步,重新思考你的整个想法。
答案 1 :(得分:1)
提示:既不能抛出Class
实例也不能调用类interface Handler<T> {
void handleAction(T t);
}
提供的其他方法,所以首先需要更改参数类型。这也可以删除通配符。
您可以通过泛型定义超类。不幸的是,enums不支持泛型。但是你可以创建像
这样的通用界面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);
}
并实现您的处理程序,如
{{1}}