有以下例子: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
提交
取消