为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

ABOUTYOU 2021-04-29 14:54:54
我有一个方法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);
查看完整描述

1 回答

?
明月笑刀无情

TA贡献1828条经验 获得超4个赞

请注意,T 可以从您当前的方法签名中推断出来。一个问题是您可以这样称呼它:

Foo foo = ExceptionUtil.getInstanceOfCause(MyException.class, exception);

这没有任何意义。

我想您想保证返回值类型和第一个参数的类类型相同?

您可以使用通用参数T

public static <T extends Throwable> T getInstanceOfCause(Class<T> expected, Throwable exc) {    
    return (expected.isInstance(exc)) ? (T) exc : getInstanceOfCause(expected, exc.getCause());
}

请注意,我如何限制TThrowableClass<T> expected并在返回值类型中同时使用了它。这保证了返回值类型与传入的类的类型相同。


查看完整回答
反对 回复 2021-05-19
  • 1 回答
  • 0 关注
  • 135 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号