为了账号安全,请及时绑定邮箱和手机立即绑定

通用示例未编译?

通用示例未编译?

饮歌长啸 2021-09-15 14:31:38
有以下例子: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是:

具体来说:

原始类型的超类(分别为超接口)是泛型类型的任何参数化的超类(超接口)的擦除。

所以,生的超类CB和原材料A,即使的超类BA<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


查看完整回答
反对 回复 2021-09-15
  • 1 回答
  • 0 关注
  • 165 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信