如何修正这个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

回到顶部