覆盖具有不同泛型类型的方法

时间:2017-05-17 07:05:19

标签: java generics

我有以下课程:

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

这不是通过覆盖方法中的不正确通用编译的。

您能否建议如何使其可行?

2 个答案:

答案 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}}