我遵循了这段代码:
public <T extends ParentException> T managedException(Exception cause) {
if(ExceptionA.class.isInstance(cause)) {
return ExceptionA.class.cast(cause);
} else if(ExceptionB.class.isInstance(cause)) {
return ExceptionB.class.cast(cause);
} else if(ExceptionC.class.isInstance(cause)){
return ExceptionC.class.cast(cause);
} else {
return new ExceptionD(cause.getMessage(), cause);
}
}
在这里ExceptionA,ExceptionB,ExceptionC,ExceptionD是儿童ParentException。
在编译时,我得到了错误:
incompatible types: ExceptionA cannot be converted to T
incompatible types: ExceptionB cannot be converted to T
incompatible types: ExceptionC cannot be converted to T
incompatible types: ExceptionD cannot be converted to T
但是,如果我将代码更改为:
@SuppressWarnings("unchecked")
public <T extends ParentException> T managedException(Exception cause) {
if(ExceptionA.class.isInstance(cause)) {
return (T) ExceptionA.class.cast(cause);
} else if(ExceptionB.class.isInstance(cause)) {
return (T) ExceptionB.class.cast(cause);
} else if(ExceptionC.class.isInstance(cause)){
return (T) ExceptionC.class.cast(cause);
} else {
return (T) new ExceptionD(cause.getMessage(), cause);
}
}
它没有编译错误。
正如 SO 线程的这个答案中提到的:How do I make the method return type generic? ,T允许使用 with进行转换,并且在此线程中给出了另一个指针:Java 泛型:泛型类型仅定义为返回类型。但我的问题是:当T有界并且所有返回的对象都落入指定的界限时,为什么我需要使用类型转换?
慕哥9229398
浮云间
相关分类