簡體   English   中英

使用泛型類型參數強制轉換異常:正確的方法嗎?

[英]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.

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