Heim  >  Artikel  >  Java  >  Detaillierte Erläuterung des Beispielcodes von Java-Generika

Detaillierte Erläuterung des Beispielcodes von Java-Generika

黄舟
黄舟Original
2017-03-21 10:19:491589Durchsuche

In diesem Artikel werden hauptsächlich die relevanten Kenntnisse über Java-Generika vorgestellt. Hat einen sehr guten Referenzwert. Schauen wir es uns mit dem Editor an

Schauen Sie sich zunächst den folgenden Code an:

public class generictype {
 public static void main(String str[]) {
  Hashtable h =new Hashtable();
  h.put(1, "String类型");
  int a = (String) h.get(1);
  System.out.println(a);
 }
}
//执行结果
String类型
//如果我们将上述由红色标出的String改为int执行后结果如下(更改后编译没有错误):
Exception in thread "main" java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Integer
 at genetictype.generictype.main(generic1.java:10)

Das Obige ist die erzwungene Typkonvertierung kann zu einem typischen Fehler führen. Dieser Fehler kann jedoch während der Kompilierung nicht erkannt werden, sodass nach der JVM-Prüfung zur Laufzeit eine Typkonvertierungsausnahme ausgelöst wird.

Sehen Sie sich den folgenden Code an:

public class generictype { 
 public static void main(String str[]) {  
 Hashtable<Integer, String> h = new Hashtable<Integer, String>();
  h.put(1, "String类型");
  String a= h.get(1);
  System.out.println(a);
 }
}
//执行结果
string类型
//需要提出的是1.上述由红色标出的String如果改为int,在编译的时候会报错
   2.在h.get(1)前面不需要再进行强制类型转换。
Zusammenfassend ist die Rolle von Generika:

1 Es wird beim Überprüfen kompiliert Typsicherheit (Fehler beheben, die durch erzwungene Typkonvertierung in Java verursacht werden können) hat der Compiler eine große Aufgabe.

2. Code-Wiederverwendungsrate verbessern

Typlöschung:

Typlöschung bedeutet, dass die Klasse Wenn der Compiler die .java-Datei kompiliert Wenn generische Parameter entfernt werden, sind die generischen Parameter nicht sichtbar, wenn der JVM die Bytecode-Datei lädt. Dieser Vorgang wird als Typlöschung bezeichnet.

Phänomene im Zusammenhang mit der Typlöschung:

(1) Generische Klassen haben nicht den Klassentyp „Klasse“. Beispielsweise gibt es keine Listf7e83be87db5cd2d9a8a0b8117b38cd4.class oder Listc0f559cc8d56b43654fcbe4aa9df7b4a.class, sondern nur List.class.

(2) Statische Variablen werden von allen Instanzen einer generischen Klasse gemeinsam genutzt.

public class generictype 
{
 public static void main(String str[]){
  test1<String> t = new test1<String>();
  test1<Date> tt = new test1<Date>();
  System.out.println(t.a);
  System.out.println(tt.a);
 }
}
class test1<T>{
 static int a = 1;
}
//结果
1

(3) Generische Typparameterfehler können nicht durch Ausnahmebehandlung weitergeleitet werden, da die Ausnahmebehandlung von jvm implementiert wird, und Die von jvm geladene Bytecode-Datei hat die generischen Merkmale gelöscht, was indirekt auch die Bedeutung von Generika veranschaulicht: Beim Kompilieren wurde ein Parametertypfehler festgestellt.

Der grundlegende Prozess der Typlöschung ist ebenfalls relativ einfach:

1. Ersetzen Sie die Typparameter durch die übergeordnete Klasse der obersten Ebene, bei der es sich im Allgemeinen um

Object handelt : Wenn eine Obergrenze für den Typparameter angegeben ist, wird diese Obergrenze verwendet.

2. Entfernen Sie die angezeigte Typdeklaration, dh entfernen Sie den Inhalt von a8093152e673feb7aba1828c43532094.

Zum Beispiel: Die Methodendeklaration T get() wird zu Object get(); Als Nächstes müssen Sie möglicherweise einige Bridge-Methoden generieren. Dies liegt daran, dass der Klasse nach dem Löschen des Typs möglicherweise einige notwendige Methoden fehlen. Betrachten Sie beispielsweise den folgenden Code:

public class generictype {public static void main(String str[]) {
  test3 t =new test3();
   t.getT("11111");
 }
}
interface test2<T>{
 public T getT(T t);
}
class test3 implements test2<String>{
 public String getT(String t){
  return t;
 }
}
//类型擦除后的代码
public class generictype {
 public static void main(String str[]) {
  test3 t = new test3();
  t.getT("11111");
 }
 interface test2 {
  public Object getT(Object t);
 }
 class test3 implements test2 {
 public String getT(String T){
   return T }
 public Object getT(Object t) {
  return this.getT((String) t);
  }//如果没有这段代码,在类型擦除后test3没有重写接口test2的抽象方法,明显错误,因此编译器的巨大作用就是在这里帮忙生成了该方法,同时编译器也依靠该功能完成检错任务。
}

Klassifizierung von Generika: generische Klassen, generische Schnittstellen, generische Methoden, generische Ausnahmen

Generische Klasse

public class generictype {
 public static void main(String str[]) {
  test<Integer, String> t = new test<Integer, String>();
  t.put(1, "str1");
  t.put(2, "str2");
  System.out.println(t.get(1));
  System.out.println(t.get(2));
 }
}
class test<T, V> {
 public Hashtable<T, V> h = new Hashtable<T, V>();
 public void put(T t, V v) {
  h.put(t, v);
 }
 public V get(T t) {
  return h.get(t);
 }
}
//执行结果
str1
str2

Polymorphe Methode (generische Methode): in Funktion Definieren Sie generische Parameter vor dem Namen . Sie können die Parameterliste, den Rückgabewerttyp und den Methodenkörper übergeben.

Das obige ist der detaillierte Inhalt vonDetaillierte Erläuterung des Beispielcodes von Java-Generika. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn