[英]Casting Exceptions Using Generic Type Parameters: Right way to do it?
這是帶有嵌入式注釋/問題的示例類。 您能建議解決這種情況的最佳方法嗎?
public abstract class AbstractThreadWithException<TException extends Exception>
extends Thread {
private TException _exception;
public TException getException() {
return _exception;
}
// I don't like this annotation: SuppressWarnings. Is there a work-around?
// I noticed Google Guava code works very hard to avoid these annos.
@SuppressWarnings("unchecked")
@Override
public void run() {
try {
runWithException();
}
// By Java rules (at least what my compiler says):
// I cannot catch type TException here.
catch (Exception e) {
// This cast requires the SuppressWarnings annotation above.
_exception = (TException) e;
}
}
public abstract void runWithException()
throws TException;
}
我想可以傳遞對Class<? extends Exception>
的引用Class<? extends Exception>
Class<? extends Exception>
,但這看起來很丑。 還有更優雅的解決方案嗎?
不幸的是,與Java思維相比,我的大腦更難與C ++思維聯系在一起,因此圍繞模板與泛型的混淆。 我認為此問題與類型擦除有關,但我不確定100%。
您正在嘗試恢復運行時類型信息,所以是的,您將需要Class.cast
或類似的東西。 就目前而言,因為您正在捕獲並存儲所有Exception
所以您的代碼可以在getException
的調用方拋出ClassCastException
。
您可能會發現刪除泛型並讓調用者使用instanceof
或類似方法更好。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.