使程序友好并使其使用泛型

时间:2016-09-05 05:10:17

标签: java class generics methods

我有一个我编写的程序,MyStack.java,我试图把它变成MyStackGeneric.java。我遇到了一些障碍。

我不知道如何:

  • 让CLASS友好

  • 将我拥有的当前方法转换为通用方法。

我找到的资源建议将我的方法更改为泛型,但示例中使用的方法有参数,而我的程序中的方法不是通用的。

到目前为止,这是我的代码:

import java.util.ArrayList;
import java.util.Scanner;
import java.util.Iterator;

public abstract class MyStackGeneric extends ArrayList<Integer> {

    public void print() {
        Iterator s = this.iterator();
        while (s.hasNext()) {
            System.out.print(s.next() + ", ");
        }
        System.out.println("");
    }

    public Object peek() {
        return this.get(getSize() - 1);
    }

    public Object pop() {
        Object o = this.get(getSize() - 1);
        this.remove(getSize() - 1);
        return o;
    }

    public void push(Integer o) {
        this.add(o);
    }

    public boolean empty() {
        return this.isEmpty();
    }

    public int getSize() {
        return this.size();
    }

    @Override
    public String toString() {
        return "stack: " + this.toString();
    }

    public void binaryOperator(char op) {
        Integer var1;
        Integer var2;
        boolean exist = true;
        if (op == '+') {
            try {
                var1 = (int) peek();
            } catch (ArrayIndexOutOfBoundsException e) {
                System.out.println("Exception: Need two operands");
                var1 = 0;
                exist = false;
            }
            if (exist)
                pop();
            try {
                var2 = (int) peek();
            } catch (ArrayIndexOutOfBoundsException e) {
                System.out.println("Exception: Need two operands");
                var2 = 0;
                exist = false;
            }
            if (exist)
                pop();
            var2 += var1;
            push(var2);
        }
        if (op == '-') {
            try {
                var1 = (int) peek();
            } catch (ArrayIndexOutOfBoundsException e) {
                System.out.println("Exception: Need two operands");
                var1 = 0;
                exist = false;
            }
            if (exist)
                pop();
            try {
                var2 = (int) peek();
            } catch (ArrayIndexOutOfBoundsException e) {
                System.out.println("Exception: Need two operands");
                var2 = 0;
                exist = false;
            }
            if (exist)
                pop();
            var2 -= var1;
            push(var2);
        }
    }

    public void readInput(Scanner s) {
        char c;
        while (s.hasNext()) {
            String[] strInput = s.next().split(" ");
            for (String s2 : strInput) {
                if (s2.matches("[+-]?\\d+")) {
                    push(Integer.parseInt(s2));
                } else if (s2.matches("[+-]")) {
                    c = s2.charAt(0);
                    binaryOperator(c);
                } else if (s2.matches("p")) {
                    print();
                } else if (s2.length() > 1) {
                    System.out.println("Exception: too long: " + s2);
                } else if (s2.length() == 1) {
                    System.out.println("Exception: Unknown Command " + s2);
                }
            }
        }
    }

    public static void main(String[] args) {
        MyStack my = new MyStack();
        my.readInput(new Scanner(System.in));
    }
}

2 个答案:

答案 0 :(得分:1)

之前我还没有听说过Java中的友好方法。正如我从here发现的那样:

  

无法将方法标记为“友好”。但是根据您的需要,package-private就足够了。

要概括您的课程,您应该用Object替换所有IntegerT提及,并按如下方式声明该课程:

public abstract class MyStackGeneric<T> { ... }

请注意,extends ArrayList<Integer>使该类依赖于Integer中的ArrayList实现:

public abstract  class MyStackGeneric<T> extends ArrayList<T> { ... }

顺便说一句,你最好不要忘记原始类型,不要使用它们:

Iterator<T> s = this.iterator();
         ^

答案 1 :(得分:1)

你应该做更多的事情&#34;学习&#34;关于您在源代码中使用的概念:

  1. 您宣布您的课程为抽象。这是为什么?该类中绝对 nothing 表示它应该/需要是抽象的。
  2. 小心复制&amp; paste:你的新类中的主要方法......仍在使用类名MyStack。所以,你没有测试你的新课程,而是旧课程!
  3. 如果您想要友好代码;我建议人类读者友好。诚实地说:这并不是很好的&#34;伟大的&#34;码。一个很好的起点 - &#34;清洁代码&#34;罗伯特马丁。那本书很好地向你解释了如何编写能让你成为朋友的代码(你现在编写的代码更像是:让人们转身离开,不想深入研究它)。