如何修正这个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提示如下错误(截图):
image.png

StringBuilder的结构图如下:
image.png


标注截图:
image.png

标注1处:main方法调用时,参数是StringBuilder,这里没有错误,那么可以认为StringBuilder "is a T"。
标注2处:这里编译错误,那这里的StringBuilder "is NOT a T"?
为什么都是StringBuilder,却无法编译通过,有点反直觉,是我对什么的概念理解有误吗?


在线运行/测试:
https://onlinegdb.com/N5yNDTEfT

那这个问题除了强制地类型转换外有其他的解决办法吗?

P.S:该方法没有什么实际意义,完全可以不这样定义签名,这里专注于泛型语法的问题。

阅读 2.1k
3 个回答

怎么能拿子类的实例放这里呢。
试试这种方式

    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; 跟一楼的做法基本一样,不清楚你要创建这个泛型做什么

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题