gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 06:06:22 25 4
gpt4 key购买 nike

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

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);

最佳答案

请注意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());
}

注意我如何约束TThrowable ,并在 Class<T> expected 中都使用了它和返回值类型。这保证了返回值类型与传入的类的类型相同。

关于java - 获取异常原因、类型转换为正确类型的正确方法签名是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51229494/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com