Created
April 26, 2012 15:46
-
-
Save alphazero/2500494 to your computer and use it in GitHub Desktop.
Generics in Java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package oss.alphazero.temp; | |
import java.util.Map; | |
public class GenericFoo<K, V, T extends Map<K, V>> { | |
} | |
-- javap -- | |
Compiled from "GenericFoo.java" | |
public class oss.alphazero.temp.GenericFoo extends java.lang.Object | |
SourceFile: "GenericFoo.java" | |
Signature: length = 0x2 | |
00 13 | |
minor version: 0 | |
major version: 50 | |
Constant pool: | |
const #1 = class #2; // oss/alphazero/temp/GenericFoo | |
const #2 = Asciz oss/alphazero/temp/GenericFoo; | |
const #3 = class #4; // java/lang/Object | |
const #4 = Asciz java/lang/Object; | |
const #5 = Asciz <init>; | |
const #6 = Asciz ()V; | |
const #7 = Asciz Code; | |
const #8 = Method #3.#9; // java/lang/Object."<init>":()V | |
const #9 = NameAndType #5:#6;// "<init>":()V | |
const #10 = Asciz LineNumberTable; | |
const #11 = Asciz LocalVariableTable; | |
const #12 = Asciz this; | |
const #13 = Asciz Loss/alphazero/temp/GenericFoo;; | |
const #14 = Asciz LocalVariableTypeTable; | |
const #15 = Asciz Loss/alphazero/temp/GenericFoo<TK;TV;TT;>;; | |
const #16 = Asciz SourceFile; | |
const #17 = Asciz GenericFoo.java; | |
const #18 = Asciz Signature; | |
const #19 = Asciz <K:Ljava/lang/Object;V:Ljava/lang/Object;T::Ljava/util/Map<TK;TV;>;>Ljava/lang/Object;; | |
{ | |
public oss.alphazero.temp.GenericFoo(); | |
Code: | |
Stack=1, Locals=1, Args_size=1 | |
0: aload_0 | |
1: invokespecial #8; //Method java/lang/Object."<init>":()V | |
4: return | |
LineNumberTable: | |
line 5: 0 | |
LocalVariableTable: | |
Start Length Slot Name Signature | |
0 5 0 this Loss/alphazero/temp/GenericFoo; | |
LocalVariableTypeTable: length = 0xC | |
00 01 00 00 00 05 00 0C 00 0F 00 00 | |
} | |
// ========= Specialization w/ concrete type ========== | |
package oss.alphazero.temp; | |
import java.util.Map; | |
public class FooDictionary extends GenericFoo<String, Object, Map<String, Object>>{ | |
} | |
-- javap -- | |
Compiled from "FooDictionary.java" | |
public class oss.alphazero.temp.FooDictionary extends oss.alphazero.temp.GenericFoo | |
SourceFile: "FooDictionary.java" | |
Signature: length = 0x2 | |
00 11 | |
minor version: 0 | |
major version: 50 | |
Constant pool: | |
const #1 = class #2; // oss/alphazero/temp/FooDictionary | |
const #2 = Asciz oss/alphazero/temp/FooDictionary; | |
const #3 = class #4; // oss/alphazero/temp/GenericFoo | |
const #4 = Asciz oss/alphazero/temp/GenericFoo; | |
const #5 = Asciz <init>; | |
const #6 = Asciz ()V; | |
const #7 = Asciz Code; | |
const #8 = Method #3.#9; // oss/alphazero/temp/GenericFoo."<init>":()V | |
const #9 = NameAndType #5:#6;// "<init>":()V | |
const #10 = Asciz LineNumberTable; | |
const #11 = Asciz LocalVariableTable; | |
const #12 = Asciz this; | |
const #13 = Asciz Loss/alphazero/temp/FooDictionary;; | |
const #14 = Asciz SourceFile; | |
const #15 = Asciz FooDictionary.java; | |
const #16 = Asciz Signature; | |
const #17 = Asciz Loss/alphazero/temp/GenericFoo<Ljava/lang/String;Ljava/lang/Object;Ljava/util/Map<Ljava/lang/String;Ljava/lang/Object;>;>;; | |
{ | |
public oss.alphazero.temp.FooDictionary(); | |
Code: | |
Stack=1, Locals=1, Args_size=1 | |
0: aload_0 | |
1: invokespecial #8; //Method oss/alphazero/temp/GenericFoo."<init>":()V | |
4: return | |
LineNumberTable: | |
line 5: 0 | |
LocalVariableTable: | |
Start Length Slot Name Signature | |
0 5 0 this Loss/alphazero/temp/FooDictionary; | |
} | |
// === usage === | |
package oss.alphazero.temp; | |
import java.util.Map; | |
public class Main { | |
public static void main(String[] args) { | |
FooDictionary foodict = new FooDictionary(); | |
System.out.println(foodict.getClass().getCanonicalName()); | |
GenericFoo<String, Object, Map<String,Object>> genfoo = new GenericFoo<String, Object, Map<String,Object>>(); | |
System.out.println(genfoo.getClass().getCanonicalName()); | |
} | |
} | |
output: | |
oss.alphazero.temp.FooDictionary | |
oss.alphazero.temp.GenericFoo | |
-- javap -- | |
Compiled from "Main.java" | |
public class oss.alphazero.temp.Main extends java.lang.Object | |
SourceFile: "Main.java" | |
minor version: 0 | |
major version: 50 | |
Constant pool: | |
const #1 = class #2; // oss/alphazero/temp/Main | |
const #2 = Asciz oss/alphazero/temp/Main; | |
const #3 = class #4; // java/lang/Object | |
const #4 = Asciz java/lang/Object; | |
const #5 = Asciz <init>; | |
const #6 = Asciz ()V; | |
const #7 = Asciz Code; | |
const #8 = Method #3.#9; // java/lang/Object."<init>":()V | |
const #9 = NameAndType #5:#6;// "<init>":()V | |
const #10 = Asciz LineNumberTable; | |
const #11 = Asciz LocalVariableTable; | |
const #12 = Asciz this; | |
const #13 = Asciz Loss/alphazero/temp/Main;; | |
const #14 = Asciz main; | |
const #15 = Asciz ([Ljava/lang/String;)V; | |
const #16 = class #17; // oss/alphazero/temp/FooDictionary | |
const #17 = Asciz oss/alphazero/temp/FooDictionary; | |
const #18 = Method #16.#9; // oss/alphazero/temp/FooDictionary."<init>":()V | |
const #19 = Field #20.#22; // java/lang/System.out:Ljava/io/PrintStream; | |
const #20 = class #21; // java/lang/System | |
const #21 = Asciz java/lang/System; | |
const #22 = NameAndType #23:#24;// out:Ljava/io/PrintStream; | |
const #23 = Asciz out; | |
const #24 = Asciz Ljava/io/PrintStream;; | |
const #25 = Method #3.#26; // java/lang/Object.getClass:()Ljava/lang/Class; | |
const #26 = NameAndType #27:#28;// getClass:()Ljava/lang/Class; | |
const #27 = Asciz getClass; | |
const #28 = Asciz ()Ljava/lang/Class;; | |
const #29 = Method #30.#32; // java/lang/Class.getCanonicalName:()Ljava/lang/String; | |
const #30 = class #31; // java/lang/Class | |
const #31 = Asciz java/lang/Class; | |
const #32 = NameAndType #33:#34;// getCanonicalName:()Ljava/lang/String; | |
const #33 = Asciz getCanonicalName; | |
const #34 = Asciz ()Ljava/lang/String;; | |
const #35 = Method #36.#38; // java/io/PrintStream.println:(Ljava/lang/String;)V | |
const #36 = class #37; // java/io/PrintStream | |
const #37 = Asciz java/io/PrintStream; | |
const #38 = NameAndType #39:#40;// println:(Ljava/lang/String;)V | |
const #39 = Asciz println; | |
const #40 = Asciz (Ljava/lang/String;)V; | |
const #41 = class #42; // oss/alphazero/temp/GenericFoo | |
const #42 = Asciz oss/alphazero/temp/GenericFoo; | |
const #43 = Method #41.#9; // oss/alphazero/temp/GenericFoo."<init>":()V | |
const #44 = Asciz args; | |
const #45 = Asciz [Ljava/lang/String;; | |
const #46 = Asciz foodict; | |
const #47 = Asciz Loss/alphazero/temp/FooDictionary;; | |
const #48 = Asciz genfoo; | |
const #49 = Asciz Loss/alphazero/temp/GenericFoo;; | |
const #50 = Asciz LocalVariableTypeTable; | |
const #51 = Asciz Loss/alphazero/temp/GenericFoo<Ljava/lang/String;Ljava/lang/Object;Ljava/util/Map<Ljava/lang/String;Ljava/lang/Object;>;>;; | |
const #52 = Asciz SourceFile; | |
const #53 = Asciz Main.java; | |
{ | |
public oss.alphazero.temp.Main(); | |
Code: | |
Stack=1, Locals=1, Args_size=1 | |
0: aload_0 | |
1: invokespecial #8; //Method java/lang/Object."<init>":()V | |
4: return | |
LineNumberTable: | |
line 5: 0 | |
LocalVariableTable: | |
Start Length Slot Name Signature | |
0 5 0 this Loss/alphazero/temp/Main; | |
public static void main(java.lang.String[]); | |
Code: | |
Stack=2, Locals=3, Args_size=1 | |
0: new #16; //class oss/alphazero/temp/FooDictionary | |
3: dup | |
4: invokespecial #18; //Method oss/alphazero/temp/FooDictionary."<init>":()V | |
7: astore_1 | |
8: getstatic #19; //Field java/lang/System.out:Ljava/io/PrintStream; | |
11: aload_1 | |
12: invokevirtual #25; //Method java/lang/Object.getClass:()Ljava/lang/Class; | |
15: invokevirtual #29; //Method java/lang/Class.getCanonicalName:()Ljava/lang/String; | |
18: invokevirtual #35; //Method java/io/PrintStream.println:(Ljava/lang/String;)V | |
21: new #41; //class oss/alphazero/temp/GenericFoo | |
24: dup | |
25: invokespecial #43; //Method oss/alphazero/temp/GenericFoo."<init>":()V | |
28: astore_2 | |
29: getstatic #19; //Field java/lang/System.out:Ljava/io/PrintStream; | |
32: aload_2 | |
33: invokevirtual #25; //Method java/lang/Object.getClass:()Ljava/lang/Class; | |
36: invokevirtual #29; //Method java/lang/Class.getCanonicalName:()Ljava/lang/String; | |
39: invokevirtual #35; //Method java/io/PrintStream.println:(Ljava/lang/String;)V | |
42: return | |
LineNumberTable: | |
line 7: 0 | |
line 8: 8 | |
line 10: 21 | |
line 11: 29 | |
line 12: 42 | |
LocalVariableTable: | |
Start Length Slot Name Signature | |
0 43 0 args [Ljava/lang/String; | |
8 35 1 foodict Loss/alphazero/temp/FooDictionary; | |
29 14 2 genfoo Loss/alphazero/temp/GenericFoo; | |
LocalVariableTypeTable: length = 0xC | |
00 01 00 1D 00 0E 00 30 00 33 00 02 | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment