許多 Android 開發者在使用 EditText.getText() 時會發現回傳型別為 Editable,而非直接是 String。為什麼 Editable 可以直接呼叫 toString() 轉為字串?本文將從原始碼層面解析其繼承關係與設計意圖。
// EditText.java
@Override
public Editable getText() {
return (Editable) super.getText();
}
// TextView.java (父類別)
public CharSequence getText() {
return mText; // mText 為 Editable 實例
}
Editable 介面定義如下:
public interface Editable
extends CharSequence, GetChars, Spannable, Appendable {
}
關鍵點在於 Editable 繼承了 CharSequence,而 CharSequence 是 String、StringBuilder、SpannedString 等的共同父介面。Java 中所有實作 CharSequence 的物件皆可透過 toString() 取得字串表示。
Editable 提供 append、delete、replace 等修改方法,適合輸入框即時編輯場景。Spannable 可附加樣式(粗體、顏色、圖片等)。CharSequence,可直接傳遞給接受 CharSequence 的 API(如 TextView.setText)。// 直接取得字串
String content = editText.getText().toString();
// 若需保留 Span 樣式
Editable editable = editText.getText();
// 進一步操作 span...
Editable 是 CharSequence 的子介面,因此擁有 toString() 行為。Android 選擇回傳 Editable 是為了提供豐富的文字編輯與樣式功能,開發者只需在需要純字串時呼叫 toString() 即可。