1.5中, 象这样的语句怎么编译不过了?    StringBuffer buf = new StringBuffer();
    buf.append("fffff");
    buf.append("test").append("asdfasdfasf"); 提示: the AbstractStringBuffer is not visible !但是1.4肯定是可以的

解决方案 »

  1.   

    的确不是JDK1.5的问题, 我用命令行是可以编译通过的, 
    但我先编译的方式是在Eclipse里面, 其他的都编译没问题, 有点奇怪
      

  2.   

    buf.append("test").append("asdfasdfasf"); 版本不兼容这种写法吧?我见过这个问题。
      

  3.   

    写法是不错的。
    看看源代码是怎么写的。
        public synchronized StringBuffer append(String str) {
    if (str == null) {
        str = String.valueOf(str);
    } int len = str.length();
    int newcount = count + len;
    if (newcount > value.length)
        expandCapacity(newcount);
    str.getChars(0, len, value, count);
    count = newcount;
    return this;
        }增加之后将this返回,意味着 xxx.append("xxx").append()是不会错的(而且这也是设计者的用途)。
    再看看构造函数。
        public StringBuffer() {
    this(16);
        }    public StringBuffer(int length) {
    value = new char[length];
    shared = false;
        }
    这意味即使new 一个空的stringbuffer也没有问题。排除了这些 ,那看看他的继承树。
    public final class StringBuffer
        implements java.io.Serializable, CharSequence
    它的直接上司是object 
    根本没有 AbstractStringBuffer  这个 东西 。
    所以可以肯定你用的不是jdk中的stringbuffer,
    请检查你的代码。
    将这样改了之后应该不会报错了吧?
    java.lang.StringBuffer buf = new java.lang.StringBuffer();
      

  4.   

    To sjjf(水晶剑锋) ,改写成你建议的写法还是一样的错误, 
    另外, Eclipse提示出错的位置在  buf.append("test").append("asdfasdfasf"); 
    此句上, 如果改成
    buf.append("test"); buf.append("asdfasdfasf"); 就没问题, 如果改用JDK1.4也可以, 我的 java version "1.5.0_04"
    Eclipse 是 Version: 2.1.0谢谢!
      

  5.   

    eclipse版本这么低能支持1。5?
      

  6.   

    对,同问。
    eclipse版本这么低能支持1。5?
      

  7.   

    用eclipse1.5吧,超级爽
    又快又好用,耗内存还小
      

  8.   

    public class TestBuf
    {
    public static void main(String []args)
    {
       StringBuffer buf = new StringBuffer();
                buf.append("fffff");
                buf.append("test").append("asdfasdfasf"); 
       System.out.println(buf.toString());
    }
    }结果是:ffffftestasdfasdfasf这个程序没问题,我在Eclipse里试了,前面的就是,我用的也是1.5.04,但Eclipse 是3.1
      

  9.   

    奇怪的问题啊!你写的这种方式我用1.5没错的,sjjf(水晶剑锋)说得不错,是一个应该考虑的问题!
      

  10.   

    To sjjf(水晶剑锋),我觉得你贴出来的代码是JDK1.4的把, 我在JDK5中src.zip(18,053,285 字节) 中找到的StringBuffer的代码是, public final class StringBuffer
        extends AbstractStringBuilder
        implements java.io.Serializable, CharSequence
    {
    .....    public synchronized StringBuffer append(String str) {
    super.append(str);
            return this;
        }}AbstractStringBuffer的定义是:abstract class AbstractStringBuilder implements Appendable, CharSequence {
    }越来越奇怪了...
      

  11.   

    我下了一个1.5 版,
    doc下不了,在线的doc没有更新。
    http://java.sun.com/j2se/1.5.0/docs/api/index.html 
    里面的 stringbuffer 还没有长大成 1.5的。
    那也没有关系可是有些迷惑。
    代码分析还是如下。
    只不过是加了一层而已。
    大致的看了一下源代码,似乎是把空间申请修改部分封装到 AbstractStringBuilder。
    AbstractStringBuilder中有一个这样的方法。
        public AbstractStringBuilder append(String str) {
    if (str == null) str = "null";
            int len = str.length();
    if (len == 0) return this;
    int newCount = count + len;
    if (newCount > value.length)
        expandCapacity(newCount);
    str.getChars(0, len, value, count);
    count = newCount;
    return this;
        }在 StringBuffer.java中如斯用:
        public synchronized StringBuffer append(String str) {
    super.append(str);
            return this;
        }
    还是返回 this指针,按理来说是效果和1.4是一样的。
    这个地方让人郁闷。 同名同参数不同返回类型的函数,编译居然能通过。
    有悖于编程习惯,会让人误以为可以用 同名同参数不同返回类型的函数覆盖父类的方法 。
    作了下测试:
    /////////
    public abstract class  T1
    {
    public T1 a(int i)
    {
    i++;
    return null;
    }
    }
    /////////
    /////////
    public class Test extends T1
    {

    public Object a(int i)
    //public T1 a(int i)    //将该行注释掉即编译就通过了
    {
    return null;
    }
    }/////////
    后来想了想,推测是编译器自动作了向上的类型转化。才不报错。
    ( :< 在c++里也有这种情况。)
    不知道这又将是sun要鼓吹的新的编程否?我很不喜欢这种风格,破坏了美感。楼主的问题在 1.5 中没有出现。理论上也不可能出现的。我觉的还是楼主的编译环境有问题。也许某些class的版本过老?
    有一个 方法可以测试。运用反射机制。在有问题的编译环境下查看该类。
    如果有空的话再贴出代码吧 。今天到此先。
      

  12.   

    在 
    buf.append("test");
    buf.append("asdfasdfasf"); 
    这种情况下编译能通过,是吗?加上一句
    Class sbClass = buf.getClass(); 
    System.out.println("SuperClass: " + sbClass.getSuperclass().getName());
    看看结果是什么?
      

  13.   

    Hi sjjf(水晶剑锋),buf.append("test");
    buf.append("asdfasdfasf"); 
    这种方式可以编译的, 
    下面程序输出是:
    class: java.lang.StringBuffer
    SuperClass: java.lang.AbstractStringBuilder
    ffffftestasdfasdfasf
    public class Hello { public static void main(String[] args) throws Exception { // java 1.5 buf ???    
    StringBuffer buf = new StringBuffer();
    buf.append("fffff");
    //buf.append("test").append("asdfasdfasf");  // this cannot compile in Eclipse
    buf.append("test");buf.append("asdfasdfasf");  // this can compile

    Class sbClass = buf.getClass();
    System.out.println("class: " + sbClass.getName()); 
    System.out.println("SuperClass: " + sbClass.getSuperclass().getName());

    System.out.println(buf.toString());
    }
    }
      

  14.   

    the AbstractStringBuffer is not visible !
    这是拷贝的还是笔误阿? (AbstractStringBuffer)
    难道它们不在同一个包下面?
      

  15.   

    测试再更改一下
    Class sbClass = (buf.append("test2")).getClass();
    System.out.println("class: " + sbClass.getName());
      

  16.   

    StringBuffer buf = new StringBuffer("");
    这样构造看看,也许会有惊喜,呵呵
      

  17.   

    只有eclipse 3.1才支持JDK1.5 , 其它版本不行.