簡體   English   中英

對象是兩個不相交的類的實例

[英]Object is instanceof two disjoint classes

我使用javax驗證構建了Wildfly應用程序,以驗證傳入的模型。 現在,我正在嘗試編寫一個捕獲任何ValidationException的異常映射器。

@Provider
public class MyValidationMapper implements ExceptionMapper<ValidationException> {

    @Override
    public Response toResponse(ValidationException exception) {

        if (exception instanceof ResteasyViolationException) {
            // do something specific
        }

        if (exception instanceof ConstraintViolationException) {
            // do something specific
        }

        // do something generic
    }
}

如您所見,我想要對ResteasyViolationExceptionConstraintViolationException特殊處理,它們都是ValidationException直接子類。

問題是, exception這兩種類型的實例。

System.out.println(exception instanceof ResteasyViolationException);
System.out.println(exception instanceof ConstraintViolationException);

每次都產生true 因此,我的映射器的行為取決於我檢查異常類型的順序。

那怎么可能? 顯然,我對instanceof理解存在一些差距。 還是Resteasy有什么特別的?

根據javadocorg.jboss.resteasy.api.validation.ResteasyViolationException擴展了javax.validation.ConstraintViolationException ,因此在處理后者時,您也將始終處理前者。

一種選擇是不使用instanceof ,而是使用getClass()檢查實際類型。 但是要提防任何與類加載器相關的怪異現象。

潛在的問題是您從觀察中得出錯誤的結論。

您的觀察告訴您:這兩個例外不能“不相交”。 因此,最有意義的回應是質疑您自己的假設 ,即兩者是不相交的。 例如通過學習javadocs。 哪一個會告訴您Kayamann在回答中告訴您的內容:這兩個類實際上是相互關聯的。

含義:不要以為這種語言可以進行20年以上的單繼承性……突然之間就“斷絕了”,僅僅因為您遇到了似乎與該概念相矛盾的東西。

換句話說:當現實與您的期望相抵觸時,請務必先問自己“為什么我要這樣或那樣?”

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM