簡體   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