获取类型转换为正确类型的异常原因的正确方法签名是什么?

我有一个方法getInstanceOfCause(),它接受一个异常类和一个Throwable方法,遍历Throwable的原因及其原因,并返回与作为第一个参数传递的类匹配的cause的实例。看起来像这样:


public class ExceptionUtil {

    public static <T> T getInstanceOfCause(Class<? extends Throwable> expected, Throwable exc) {

        return (expected.isInstance(exc)) ? (T) exc : getInstanceOfCause(expected, exc.getCause());

    }

}

假设期望的类型确实在“原因链”中,并且该调用不会引起NPE。我可以这样使用:


MyException myException = ExceptionUtil.<MyException>getInstanceOfCause(MyException.class, exception);

这很尴尬,因为我必须两次指定类型。有什么方法可以重写方法签名,以便我可以像下面一样使用它,同时仍在编译时确保类型是Throwable的子类?


MyException myException = ExceptionUtil.getInstanceOfCause(MyException.class, exception);

或者


MyException myException = ExceptionUtil.<MyException>getInstanceOfCause(exception);


ABOUTYOU
浏览 136回答 1
1回答

明月笑刀无情

请注意,T&nbsp;可以从您当前的方法签名中推断出来。一个问题是您可以这样称呼它:Foo&nbsp;foo&nbsp;=&nbsp;ExceptionUtil.getInstanceOfCause(MyException.class,&nbsp;exception);这没有任何意义。我想您想保证返回值类型和第一个参数的类类型相同?您可以使用通用参数T:public&nbsp;static&nbsp;<T&nbsp;extends&nbsp;Throwable>&nbsp;T&nbsp;getInstanceOfCause(Class<T>&nbsp;expected,&nbsp;Throwable&nbsp;exc)&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;(expected.isInstance(exc))&nbsp;?&nbsp;(T)&nbsp;exc&nbsp;:&nbsp;getInstanceOfCause(expected,&nbsp;exc.getCause()); }请注意,我如何限制T为Throwable,Class<T> expected并在返回值类型中同时使用了它。这保证了返回值类型与传入的类的类型相同。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java