如何修正这个java泛型的错误?
这是一个关于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:该方法没有什么实际意义,完全可以不这样定义签名,这里专注于泛型语法的问题。
回答:
怎么能拿子类的实例放这里呢。
试试这种方式
public <T extends Appendable & CharSequence> T format(T sink) throws InstantiationException, IllegalAccessException { ParameterizedType ptype = (ParameterizedType) this.getClass().getGenericSuperclass();
Class<T> clazz = (Class<T>) ptype.getActualTypeArguments()[0];
T t = (T) clazz.newInstance();
T output = (sink == null) ? t : sink;
try {
output.append("append something");
} catch (IOException e) {
//ignore
}
return output;
}
参考地址
https://blog.csdn.net/weixin_34075551/article/details/86132595
回答:
无解,T 是 T,StringBuilder 是 StringBuilder
虽然 T 是 Appendable & CharSequence,StringBuilder 也是 Appendable & CharSequence,但是 T 不一定是 StringBuilder,还可能是其他类型
回答:
T output = (sink == null) ? (T)StringBuilder.class.newInstance(): sink; 跟一楼的做法基本一样,不清楚你要创建这个泛型做什么
以上是 如何修正这个java泛型的错误? 的全部内容, 来源链接: utcz.com/p/945035.html