[英]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
}
}
如您所見,我想要對ResteasyViolationException
和ConstraintViolationException
特殊處理,它們都是ValidationException
直接子類。
問題是, exception
是這兩種類型的實例。
System.out.println(exception instanceof ResteasyViolationException);
System.out.println(exception instanceof ConstraintViolationException);
每次都產生true
。 因此,我的映射器的行為取決於我檢查異常類型的順序。
那怎么可能? 顯然,我對instanceof
理解存在一些差距。 還是Resteasy有什么特別的?
根據javadoc , org.jboss.resteasy.api.validation.ResteasyViolationException
擴展了javax.validation.ConstraintViolationException
,因此在處理后者時,您也將始終處理前者。
一種選擇是不使用instanceof
,而是使用getClass()
檢查實際類型。 但是要提防任何與類加載器相關的怪異現象。
潛在的問題是您從觀察中得出錯誤的結論。
您的觀察告訴您:這兩個例外不能“不相交”。 因此,最有意義的回應是質疑您自己的假設 ,即兩者是不相交的。 例如通過學習javadocs。 哪一個會告訴您Kayamann在回答中告訴您的內容:這兩個類實際上是相互關聯的。
含義:不要以為這種語言可以進行20年以上的單繼承性……突然之間就“斷絕了”,僅僅因為您遇到了似乎與該概念相矛盾的東西。
換句話說:當現實與您的期望相抵觸時,請務必先問自己“為什么我要這樣或那樣?”
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.