使用通用类型参数转换异常:正确的方法吗?

时间:2013-07-20 15:27:07

标签: java generics exception-handling casting annotations

这是我的示例类,其中包含嵌入的注释/问题。能告诉您处理这种情况的最佳方法吗?

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>,但这看起来很难看。有更优雅的解决方案吗?

不幸的是,我的大脑比Java思维更难以理解C ++,因此围绕模板与泛型的混淆。我认为这个问题与类型擦除有关,但我并不是100%肯定。

1 个答案:

答案 0 :(得分:2)

您正在尝试恢复运行时类型信息,因此您需要Class.cast或类似信息。目前,您的代码可以向调用者ClassCastException 投放getException ,因为您正在捕获并存储所有Exception

您可能会发现删除泛型并让调用者使用instanceof或类似内容更好。