Skip to content

Instantly share code, notes, and snippets.

@alphazero
Created April 26, 2012 15:46
Show Gist options
  • Save alphazero/2500494 to your computer and use it in GitHub Desktop.
Save alphazero/2500494 to your computer and use it in GitHub Desktop.
Generics in Java
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