有关java泛型中一段简单代码 擦除知识点的疑问
ringa_lee
ringa_lee 2017-04-17 17:35:11
0
6
837
  1. 下面这个程序中T 类型不是被擦除了吗?为什么使用get ( ) 方法不需要类型装换? (不适用泛型的简单代码就需要加(String) 来实现类型转换)

  2. 擦除知识点在实际编程中体现的多吗?

代码如下:

public class GenericHolder<T> {
  private T obj;
  public void set(T obj) { this.obj = obj; }
  public T get() { return obj; }
  public static void main(String[] args) {
    GenericHolder<String> holder =
      new GenericHolder<String>();
    holder.set("Item");
    String s = holder.get();
  }
}
public class SimpleHolder {
  private Object obj;
  public void set(Object obj) { this.obj = obj; }
  public Object get() { return obj; }
  public static void main(String[] args) {
    SimpleHolder holder = new SimpleHolder();
    holder.set("Item");
    String s = (String)holder.get();
  }
}
ringa_lee
ringa_lee

ringa_lee

membalas semua(6)
伊谢尔伦

Pemadaman bermakna tiada maklumat tentang parameter generik boleh diperolehi dalam kelas generik pada masa jalanan Jika sempadan ditentukan, jenis sebenar pembolehubah generik ialah sempadan Kod dalam contoh poster tidak menyatakan sempadan , jadi padamkan kepada Object, iaitu, jenis masa jalan sebenar obj ialah Object Sebab mengapa menggunakan kaedah get() tidak memerlukan penukaran jenis paksa adalah kerana pengkompil menjana kod penukaran untuk anda semasa penyusunan , Keadaan selepas pemprosesan mungkin serupa dengan String s = (String)holder.get() dalam kaedah utama Contoh 2. Untuk butiran, pengarang boleh menggunakan javap untuk menyahkompilasi dan melihat.

Mengenai soalan kedua, saya rasa ini sama dengan sama ada anda membaca kod sumber atau tidak Ia tidak menjejaskan pengaturcaraan jika anda tidak membacanya, saya faham bahawa ia akan menjadi sangat mudah untuk menulis saya masih seorang pelajar dan sebenarnya saya tidak tahu situasinya, hanya sedikit pendapat~

阿神

Generik hanya ditunjukkan dalam kod sumber, dan selepas penyusunan ia adalah bersamaan dengan contoh terakhir yang anda berikan. Oleh itu, ujian lompang awam(Senarai<String> senarai) dan ujian lompang awam(Senarai<Integer> senarai) tidak boleh terlebih muatan.

Peter_Zhu
  1. Pemadaman dilakukan semasa penyusunan, apabila fail java disusun ke dalam fail kelas. Generik Java boleh dianggap sebagai sejenis gula sintaks, menjadikan kita lebih selamat dan lebih mudah semasa menulis kod Java.

  2. Pemadaman tidak digunakan dalam kerja sebenar Pemadaman boleh dianggap sebagai tindakan tafsiran gula sintaks generik pada masa penyusunan.

刘奇
  • Apabila menggunakan kelas generik T baharu, T ditentukan sebagai String, dan pembolehubah ahlinya juga String Tiada transformasi diperlukan, tetapi ahli kelas lain ialah Objek, dan baharu
    tidak ditentukan, jadi Transformasi diperlukan.

  • Padam biasanya tidak digunakan dalam kerja sebenar.

黄舟

1. Pertama sekali, pemadaman bermaksud tag generik diserahkan kepada pengkompil Javac untuk dilaksanakan dan berfungsi. Selepas kod melepasi tempoh penyusunan, "T" diabaikan semasa operasi, dan T tidak boleh ditemui dalam fail kelas. Di sini anda menunjukkan bahawa jenisnya ialah <String>, maka pengkompil akan menukar T yang dipegang dalam GenericHolder kepada jenis String semasa penyusunan. Jadi get anda tidak perlu diubah (pengkompil telah pun mengenali String).

2. Pemadaman adalah konsep yang sangat penting dalam generik, boleh dikatakan jika anda tidak memahami pemadaman, anda tidak memahami generik. Apa yang biasa dan relevan dalam kerja sebenar ialah pensirilan dan penyahserialisasian objek, yang digunakan dalam rangka kerja seperti gson.

刘奇

GenericHolder<String> dalam

private T obj;
public void set(T obj) { this.obj = obj; }
public T get() { return obj; }

bersamaan dengan

private Object obj;
public void set(Object obj) { this.obj = obj; }
public Object get() { return (Object) obj; }
...
String s = (String) holder.get();

Ia sebenarnya hanyalah gula sintaks

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan