2015-09-26 27 views
2

在撥打電話之前,下面的代碼一切正常。我怎麼能沒有明確鑄造的問題?提前致謝。Java通用方法調用導致編譯錯誤

Validator接口

public interface Validator <T extends GenericRequest>{ 
    String validate(T request); 
} 

驗證器實現類

public class AccountOpeningRequestValidator implements Validator<AccountOpeningRequest> { 

public class AccountTerminationRequestValidator implements Validator<AccountTerminationRequest> { 

驗證服務

public class ValidationService { 

    private static final Map<Class<?>, Validator<? extends GenericRequest>> map = new HashMap<>(); 

    static { 
     map.put(AccountOpeningRequest.class, new AccountOpeningRequestValidator()); 
     map.put(AccountTerminationRequest.class, new AccountTerminationRequestValidator()); 
    } 

    public static <T extends GenericRequest> String validate(T request) { 
     // !!! This does not work !!!! 
     return map.get(request.getClass()).validate(request)); 
    } 

} 
+1

什麼是錯誤? – sje397

+0

你需要使用那種泛型嗎?你不能在GenericRequest類上有一個抽象的「驗證」方法嗎? – sje397

+0

如果在您撥打電話之前沒有問題,那不是編譯錯誤。這是一個運行時錯誤。 – sje397

回答

0

當然它不會工作。 java編譯器無法確定在你的映射中,每個值都具有與相應鍵中指定的類相同的通用參數。 你肯定是,但編譯器不是。您可以通過選中投在這堅持:

@SuppressWarning("unchecked") 
Validator<T> validator = (Validator<T>)map.get(request.getClass()); 
return validator.validate(request)); 

這樣你明確告訴編譯器「我知道更好,這個轉換將始終工作」和編譯器認爲像「好的,我會編譯它。如果你有一個運行時異常之後,這不是我的錯「。

相關問題