2013-07-08 30 views
1

爲什麼下面的代碼會產生一個很好的ClassCastException異常:ClassCastException異常帶的StringBuilder和CharSequence的

public static void main(String []args){ 
     StringBuilder s1 = new StringBuilder("quaqua"); 
     StringBuilder s12= (StringBuilder)s1.subSequence(0,3); 
     System.out.println(s12); 
    } 

,而下面的代碼(替換用字符串StringBuilder的):

public static void main(String []args){ 
     String s1 = new String("quaqua"); 
     String s12= (String)s1.subSequence(0,3); 
     System.out.println(s12); 
    } 

工作正常?;

我明白,有方法substring(int begin, int end);但是我只是好奇,爲什麼使用StringBuilder(它實現CharSequence)強制轉換不起作用,而與字符串工作。

在此先感謝。

回答

7

這是因爲StringBuilder.subSequence返回實際類是字符串:

... 
public CharSequence subSequence(int start, int end) { 
    return substring(start, end); 
} 

public String substring(int start, int end) { 
    ... 
    return new String(value, start, end - start); 
} 

你不能施放字符串的StringBuilder。

1

StringBuilder.subSequence API文檔:

形式的該方法的調用

sb.subSequence(begin, end) 

的行爲以完全相同的方式調用

sb.substring(begin, end) 

雖然StringCharSequenceString不是StringBuilder。所以演員失敗了。

你可以這樣做,而不是:

StringBuilder s12= new StringBuilder(s1); 
s12.setLength(3); 
0

方法String.subSequence必須返回運行時類型String它只是實現CharSequence類型的對象。

聲明返回類型的方法必須是超類型返回對象的實際運行時類型。你很幸運能夠投入正確的類型。

1

因爲subSequence()方法在運行時返回String對象,而不是StringBuilder對象。根據文檔StringBuilder#subSequence()

返回一個新的字符序列,該序列是該序列的子序列。 形式

sb.subSequence的此方法的調用(開始,結束) 的行爲以完全相同的方式調用

某人。子(開始,結束)

如果你經過這裏的代碼:

public CharSequence subSequence(int beginIndex, int endIndex) { 
    return this.substring(beginIndex, endIndex); 
} 

如果你看到substring()代碼:

public String substring(int beginIndex, int endIndex) { 
    if (beginIndex < 0) { 
     throw new StringIndexOutOfBoundsException(beginIndex); 
    } 
    if (endIndex > value.length) { 
     throw new StringIndexOutOfBoundsException(endIndex); 
    } 
    int subLen = endIndex - beginIndex; 
    if (subLen < 0) { 
     throw new StringIndexOutOfBoundsException(subLen); 
    } 
    return ((beginIndex == 0) && (endIndex == value.length)) ? this 
      : new String(value, beginIndex, subLen); 
} 

它返回一個String,因爲String執行CharSequence接口返回類型subSequence()可以是CharSequence,但是它在內部可以與String。而你不能轉換StringStringBuilder