2017-05-17 154 views
0

我有以下類:不同泛型類型覆蓋方法

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

你在調用'ACTION_1.handleAction(...)'或'someDynamicStrategy.handleAction(規劃.. 。)'? – shmosel

+0

很明顯,問題在於你正在使用'類'類型。這種類型不代表'T'類型的對象,而是代表與Java類相關的元信息。另一個問題是,你試圖生成一個'enum',這是不可能的。嘗試定義一個'策略'接口。 –

回答

2

你最好回到這裏。你的想法只是違反Liskov Substitution Principle

基本上你想要限制一個子類中可以作爲參數傳入的方法。

,打破了整體思路是子類來代替其超類的使用。因爲現在,突然之間,想要調用該方法的代碼必須檢查它呼籲對象的類型 - 以確保電話與「無效」參數的方法。

換句話說:取此編譯器錯誤作爲症狀。即使你以某種方式解決具體問題,如上所述 - 你最好退後一步,重新思考你的整個想法。

1

提示:既不可能拋出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); 
    } 
+0

使用''類對象作爲方法的參數是沒有用的,如果你需要調用它類型T'的'方法;) –

+0

OP的參數是'類',我不知道什麼是用它做。但你是對的:在大多數情況下,T是需要的。 –

+0

請更正您的答案,並指定使用'Class '是毫無價值的。 –