通用示例未编译?

有以下例子:


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 类型。


出了什么问题,有没有办法在不强制转换的情况下做到这一点?


饮歌长啸
浏览 166回答 1
1回答

慕后森

原始类型语言规范的相关部分是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&nbsp;C<>().id.trim()); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;^^&nbsp;Can&nbsp;use&nbsp;any&nbsp;relevant&nbsp;type&nbsp;here,&nbsp;but&nbsp;diamond&nbsp;operator&nbsp;works&nbsp;too
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java