繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM