这是一个关于Java泛型的问题
写了一个方法,代码如下:
import java.io.IOException;
public class Foo {
public static <T extends Appendable & CharSequence> T format(T sink) {
T output = (sink == null) ? new StringBuilder() : sink;
try {
output.append("append something");
} catch (IOException e) {
//ignore
}
return output;
}
}
IDE提示如下错误(截图):
StringBuilder的结构图如下:
标注截图:
标注1处:main方法调用时,参数是StringBuilder,这里没有错误,那么可以认为StringBuilder "is a T"。
标注2处:这里编译错误,那这里的StringBuilder "is NOT a T"?
为什么都是StringBuilder,却无法编译通过,有点反直觉,是我对什么的概念理解有误吗?
在线运行/测试:
https://onlinegdb.com/N5yNDTEfT
那这个问题除了强制地类型转换外有其他的解决办法吗?
P.S:该方法没有什么实际意义,完全可以不这样定义签名,这里专注于泛型语法的问题。
怎么能拿子类的实例放这里呢。
试试这种方式
参考地址
https://blog.csdn.net/weixin_34075551/article/details/86132595