神奇好望角 The Magical Cape of Good Hope

庸人不必自扰,智者何需千虑?
posts - 26, comments - 50, trackbacks - 0, articles - 11
  BlogJava :: 首页 ::  :: 联系 :: 聚合  :: 管理

钻石运算符的一个 BUG

Posted on 2011-11-11 11:06 蜀山兆孨龘 阅读(1551) 评论(0)  编辑  收藏 所属分类: Java SE

先看出错的代码:

        public class Holder<T> {
            private T value;

            public Holder() {
            }

            public Holder(T value) {
                this.value = value;
            }

            public void setValue(T value) {
                this.value = value;
            }

            // 此处省略若干行。
        }

        Holder<Object> holder = new Holder<>("xxx");
    

看起来还好,但编译的时候却报错:

Uncompilable source code - incompatible types
  required: zhyi.test.Holder<java.lang.Object>
  found:    zhyi.test.Holder<java.lang.String>

老老实实把类型写出来就没问题:

        Holder<Object> holder = new Holder<Object>("xxx");
    

如果非要用钻石运算符的话,可以采取下列两种方式之一:

        // 使用默认构造器,再调用 setValue 方法。
        Holder<Object> holder = new Holder<>();
        holder.setValue("xxx");

        // 使用泛型通配符,但之后就不能调用 setValue 了,否则编译出错。
        Holder<? extends Object> holder = new Holder<>("xxx");
    

只有注册用户登录后才能发表评论。


网站导航: