有以下例子:public class A<S> { public S id;}public class B extends A<String> { B(){ this.id = ""; }}public class C<K> extends B { public K property; public static void main(String[] args) { System.out.println(new C().id.substring(0,1)); }}new C().id.substring(0,1) 不會編譯,因為 id 是它所說的 Object 類型。出了什么問題,有沒有辦法在不強制轉換的情況下做到這一點?
1 回答

慕后森
TA貢獻1802條經驗 獲得超5個贊
原始類型語言規范的相關部分是JLS Sec 4.8是:
具體來說:
原始類型的超類(分別為超接口)是泛型類型的任何參數化的超類(超接口)的擦除。
所以,生的超類C
是B
和原材料A
,即使的超類B
是A<String>
。(這讓我的頭有點痛)。
下一段說:
未從其超類或超接口繼承的原始類型 C 的構造函數(第 8.8 節)、實例方法(第 8.4 節、第 9.4 節)或非靜態字段(第 8.3 節)的類型是對應于的原始類型在對應于 C 的泛型聲明中刪除其類型。
因此,該id
字段的類型是 的擦除S
,即Object
。
與以往一樣,這里的解決方法是不要使用原始類型。
System.out.println(new C<>().id.trim()); // ^^ Can use any relevant type here, but diamond operator works too
添加回答
舉報
0/150
提交
取消