关于泛型

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

// 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;
}



通过javap -c

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>



//编译器自动转类型

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


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

你可能感兴趣的:(java,F#,J#)