我試圖在Exception
中存儲泛型對象的集合,並且遇到了找出泛型的麻煩。具體而言,我使用Hibernate驗證器,並希望將收集的違規列表保存在異常中,以便在應用程序的另一層進行處理。這裏有一個例子:在異常的參數中使用泛型
Set<ConstraintViolation<User>> violations = validator.validate(user);
if (violations.size() > 0) {
throw new ValidationException("User details are invalid", violations);
}
在Eclipse中,throws
線呈現不確定的構造,並建議我改變構造函數簽名ValidationException(String, Set<ConstraintViolation<User>>
。這裏的ValidationException:
public class ValidationException extends Exception {
private Set<ConstraintViolation<?>> violations;
public ValidationException() {
}
public ValidationException(String msg) {
super(msg);
}
public ValidationException(String msg, Throwable cause) {
super(msg, cause);
}
public ValidationException(String msg, Set<ConstraintViolation<?>> violations) {
super(msg);
this.violations = violations;
}
public Set<ConstraintViolation<?>> getViolations() {
return violations;
}
}
不過,我想保持ValidationException
通用的,所以我可以用它不僅僅是User
驗證了。我也試過Set<ConstraintViolation<? extends Object>>
,但得到相同的結果。
有沒有辦法完成我想要做的事情?
爲什麼你需要的ConstrainsViolation是通用擺在首位?難道你不能只爲每個可能的違規行爲創建一個繼承AbstractBase的單獨的類嗎? – Falcon 2011-02-14 13:17:52
我認爲使用泛型異常類型會是一個好主意,但是像@axtavt提到的那樣,異常不能是泛型的。請參閱此常見問題解答:http://www.angelikalanger.com/GenericsFAQ/FAQSections/TechnicalDetails.html#FAQ301 – Tauren 2011-02-14 13:31:23
@Falcon:`ConstraintsViolation`是Hibernate驗證包的一部分,它使用泛型。這不是我自己的一類。 – Tauren 2011-02-14 13:32:49