关于泛型

stack1



// Generic stack using E[] - Pages 125-127
import java.util.Arrays;

public class Stack < E >
{
private E[] elements;
private int size = 0;
private static final int DEFAULT_INITIAL_CAPACITY = 16;

// The elements array will contain only E instances from push(E).
// This is sufficient to ensure type safety, but the runtime
// type of the array won't be E[]; it will always be Object[]!
@SuppressWarnings("unchecked")
public Stack()
{
elements = (E[])new Object[DEFAULT_INITIAL_CAPACITY];
}

public void push(E e)
{
ensureCapacity();
elements[size++] = e;
}

public E pop()
{
if(size == 0)
throw new EmptyStackException();
E result = elements[--size];
elements[size] = null; // Eliminate obsolete reference
return result;
}

public boolean isEmpty()
{
return size == 0;
}

private void ensureCapacity()
{
if(elements.length == size)
elements = Arrays.copyOf(elements,2 * size + 1);
}

// Little program to exercise our generic Stack
public static void main(String[] args)
{
Stack < String > stack = new Stack < String >();
for(String arg:args)
stack.push(arg);
while(!stack.isEmpty())
System.out.println(stack.pop().toUpperCase());
}
}



stack2

package com.gegeric;

// Generic stack using Object[] - Pages 125-127
import java.util.Arrays;

public class Stack<E> {
private Object[] elements;
private int size = 0;
private static final int DEFAULT_INITIAL_CAPACITY = 16;

public Stack() {
elements = new Object[DEFAULT_INITIAL_CAPACITY];
}

public void push(E e) {
ensureCapacity();
elements[size++] = e;
}

// Appropriate suppression of unchecked warning
public E pop() {
if (size == 0)
throw new EmptyStackException();
// push requires elements to be of type E, so cast is correct
@SuppressWarnings("unchecked")
E result = (E) elements[--size];
elements[size] = null; // Eliminate obsolete reference
return result;
}

public boolean isEmpty() {
return size == 0;
}

private void ensureCapacity() {
if (elements.length == size)
elements = Arrays.copyOf(elements, 2 * size + 1);
}

// Little program to exercise our generic Stack
public static void main(String[] args) {
Stack<String> stack = new Stack<String>();
for (String arg : args)
stack.push(arg);
while (!stack.isEmpty())
System.out.println(stack.pop().toUpperCase());
}
}


通过jad反编译类文件出来的java文件
stack1.class 反编译出来的


// Decompiled by Jad v1.5.8g. Copyright 2001 Pavel Kouznetsov.
// Jad home page: http://www.kpdus.com/jad.html
// Decompiler options: packimports(3)
// Source File Name: Stack.java

import java.io.PrintStream;
import java.util.Arrays;

public class Stack
{

public Stack()
{
size = 0;
elements = new Object[16];
}

public void push(Object e)
{
ensureCapacity();
elements[size++] = e;
}

public Object pop()
{
if(size == 0)
{
throw new EmptyStackException();
} else
{
Object result = elements[--size];
elements[size] = null;
return result;
}
}

public boolean isEmpty()
{
return size == 0;
}

private void ensureCapacity()
{
if(elements.length == size)
elements = Arrays.copyOf(elements, 2 * size + 1);
}

public static void main(String args[])
{
Stack stack = new Stack();
String args1[];
int j = (args1 = args).length;
for(int i = 0; i < j; i++)
{
String arg = args1[i];
stack.push(arg);
}

for(; !stack.isEmpty(); System.out.println(((String)stack.pop()).toUpperCase()));
}

private Object elements[];
private int size;
private static final int DEFAULT_INITIAL_CAPACITY = 16;
}



通过javap -c

F:\J2EE\java jpd>javap -c Stack
Compiled from "Stack.java"
public class Stack extends java.lang.Object{
public Stack();
Code:
0: aload_0
1: invokespecial #17; //Method java/lang/Object."<init>":()V
4: aload_0
5: iconst_0
6: putfield #19; //Field size:I
9: aload_0
10: bipush 16
12: anewarray #3; //class java/lang/Object
15: putfield #21; //Field elements:[Ljava/lang/Object;
18: return

public void push(java.lang.Object);
Code:
0: aload_0
1: invokespecial #32; //Method ensureCapacity:()V
4: aload_0
5: getfield #21; //Field elements:[Ljava/lang/Object;
8: aload_0
9: dup
10: getfield #19; //Field size:I
13: dup_x1
14: iconst_1
15: iadd
16: putfield #19; //Field size:I
19: aload_1
20: aastore
21: return

public java.lang.Object pop();
Code:
0: aload_0
1: getfield #19; //Field size:I
4: ifne 15
7: new #41; //class EmptyStackException
10: dup
11: invokespecial #43; //Method EmptyStackException."<init>":()V
14: athrow
15: aload_0
16: getfield #21; //Field elements:[Ljava/lang/Object;
19: aload_0
20: dup
21: getfield #19; //Field size:I
24: iconst_1
25: isub
26: dup_x1
27: putfield #19; //Field size:I
30: aaload
31: astore_1
32: aload_0
33: getfield #21; //Field elements:[Ljava/lang/Object;
36: aload_0
37: getfield #19; //Field size:I
40: aconst_null
41: aastore
42: aload_1
43: areturn

public boolean isEmpty();
Code:
0: aload_0
1: getfield #19; //Field size:I
4: ifne 9
7: iconst_1
8: ireturn
9: iconst_0
10: ireturn

public static void main(java.lang.String[]);
Code:
0: new #1; //class Stack
3: dup
4: invokespecial #56; //Method "<init>":()V
7: astore_1
8: aload_0
9: dup
10: astore 5
12: arraylength
13: istore 4
15: iconst_0
16: istore_3
17: goto 33
20: aload 5
22: iload_3
23: aaload
24: astore_2
25: aload_1
26: aload_2
27: invokevirtual #57; //Method push:(Ljava/lang/Object;)V
30: iinc 3, 1
33: iload_3
34: iload 4
36: if_icmplt 20
39: goto 58
42: getstatic #59; //Field java/lang/System.out:Ljava/io/PrintStream;
45: aload_1
46: invokevirtual #65; //Method pop:()Ljava/lang/Object;
49: checkcast #67; //class java/lang/String
52: invokevirtual #69; //Method java/lang/String.toUpperCase:()Ljava/lang/String;
55: invokevirtual #73; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
58: aload_1
59: invokevirtual #79; //Method isEmpty:()Z
62: ifeq 42
65: return

}


F:\J2EE\java jpd>


stack2.class反编译出来的java

[code]
// Decompiled by Jad v1.5.8g. Copyright 2001 Pavel Kouznetsov.
// Jad home page: http://www.kpdus.com/jad.html
// Decompiler options: packimports(3)
// Source File Name: Stack.java

package com.gegeric;

import java.io.PrintStream;
import java.util.Arrays;

// Referenced classes of package com.gegeric:
// EmptyStackException

public class Stack
{

public Stack()
{
size = 0;
elements = new Object[16];
}

public void push(Object e)
{
ensureCapacity();
elements[size++] = e;
}

public Object pop()
{
if(size == 0)
{
throw new EmptyStackException();
} else
{
Object result = elements[--size];
elements[size] = null;
return result;
}
}

public boolean isEmpty()
{
return size == 0;
}

private void ensureCapacity()
{
if(elements.length == size)
elements = Arrays.copyOf(elements, 2 * size + 1);
}

public static void main(String args[])
{
Stack stack = new Stack();
String args1[];
int j = (args1 = args).length;
for(int i = 0; i < j; i++)
{
String arg = args1[i];
stack.push(arg);
}

for(; !stack.isEmpty(); System.out.println(((String)stack.pop()).toUpperCase()));
}

private Object elements[];
private int size;
private static final int DEFAULT_INITIAL_CAPACITY = 16;
}

[/code]

通过javap -c

[code]
F:\java\EffectiveJava\bin\com\gegeric>javap -c Stack
Compiled from "Stack.java"
public class com.gegeric.Stack extends java.lang.Object{
public com.gegeric.Stack();
Code:
0: aload_0
1: invokespecial #15; //Method java/lang/Object."<init>":()V
4: aload_0
5: iconst_0
6: putfield #17; //Field size:I
9: aload_0
10: bipush 16
12: anewarray #3; //class java/lang/Object
15: putfield #19; //Field elements:[Ljava/lang/Object;
18: return

public void push(java.lang.Object);
Code:
0: aload_0
1: invokespecial #31; //Method ensureCapacity:()V
4: aload_0
5: getfield #19; //Field elements:[Ljava/lang/Object;
8: aload_0
9: dup
10: getfield #17; //Field size:I
13: dup_x1
14: iconst_1
15: iadd
16: putfield #17; //Field size:I
19: aload_1
20: aastore
21: return

public java.lang.Object pop();
Code:
0: aload_0
1: getfield #17; //Field size:I
4: ifne 15
7: new #40; //class com/gegeric/EmptyStackException
10: dup
11: invokespecial #42; //Method com/gegeric/EmptyStackException."<init>":()V
14: athrow
15: aload_0
16: getfield #19; //Field elements:[Ljava/lang/Object;
19: aload_0
20: dup
21: getfield #17; //Field size:I
24: iconst_1
25: isub
26: dup_x1
27: putfield #17; //Field size:I
30: aaload
31: astore_1
32: aload_0
33: getfield #19; //Field elements:[Ljava/lang/Object;
36: aload_0
37: getfield #17; //Field size:I
40: aconst_null
41: aastore
42: aload_1
43: areturn

public boolean isEmpty();
Code:
0: aload_0
1: getfield #17; //Field size:I
4: ifne 9
7: iconst_1
8: ireturn
9: iconst_0
10: ireturn

public static void main(java.lang.String[]);
Code:
0: new #1; //class com/gegeric/Stack
3: dup
4: invokespecial #55; //Method "<init>":()V
7: astore_1
8: aload_0
9: dup
10: astore 5
12: arraylength
13: istore 4
15: iconst_0
16: istore_3
17: goto 33
20: aload 5
22: iload_3
23: aaload
24: astore_2
25: aload_1
26: aload_2
27: invokevirtual #56; //Method push:(Ljava/lang/Object;)V
30: iinc 3, 1
33: iload_3
34: iload 4
36: if_icmplt 20
39: goto 58
42: getstatic #58; //Field java/lang/System.out:Ljava/io/PrintStream;
45: aload_1
46: invokevirtual #64; //Method pop:()Ljava/lang/Object;
49: checkcast #66; //class java/lang/String
52: invokevirtual #68; //Method java/lang/String.toUpperCase:()Ljava/lang/String;
55: invokevirtual #72; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
58: aload_1
59: invokevirtual #78; //Method isEmpty:()Z
62: ifeq 42
65: return

}


F:\java\EffectiveJava\bin\com\gegeric>

[/code]

//编译器自动转类型

   for(; !stack.isEmpty(); System.out.println(((String)stack.pop()).toUpperCase())); 


for(; !stack.isEmpty(); System.out.println(((String)stack.pop()).toUpperCase()));
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值