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