6

私の質問は2つあり、非常に簡単です

  1. 列挙型をそのまま誤解する

  2. このアイデアには、私のコードにいくつかの重要な抽象化が欠けています

oprt.calc(x, y)警告付きでコンパイルできない コード例cannot find symbol

public enum Operation {

    PLUS {
        public double calc(double x, double y) {
            return x + y;
        }
    },
    MINUS {
        public double calc(double x, double y) {
            return x - y;
        }
    },
    MULTILPLE {
        public double calc(double x, double y) {
            return x * y;
        }
    },
    DIVIDED_BY {
        public double calc(double x, double y) {
            return x / y;
        }
    };

    public static void main(String args[]) {
        double x = 15.25;
        double y = 24.50;
        for (Operation oprt : Operation.values()) {
            System.out.println(x + " " + oprt + " " 
                    + y + " = " + oprt.calc(x, y));
        }
    }
}
4

6 に答える 6

8

あなたが見逃しているのは、 calc() メソッドの抽象宣言です:

enum Operation {

  PLUS {
      public double calc(double x, double y) {
          return x + y;
      }
  },
  MINUS {
      public double calc(double x, double y) {
          return x - y;
      }
  },
  MULTILPLE {
      public double calc(double x, double y) {
          return x * y;
      }
  },
  DIVIDED_BY {
      public double calc(double x, double y) {
          return x / y;
      }
  };

  **public abstract double calc(double x, double y);**

  public static void main(String args[]) {
      double x = 15.25;
      double y = 24.50;
      for (Operation oprt : Operation.values()) {
          System.out.println(x + " " + oprt + " " 
                  + y + " = " + oprt.calc(x, y));
      }
  }
}
于 2013-04-19T12:39:59.317 に答える
7

列挙型で抽象メソッドdouble calc(double x, double y)を直接宣言し、すべての列挙型メンバーでオーバーライドする必要があります。

于 2013-04-19T12:38:13.910 に答える
3

calc()元のcalc()メソッドがありませんが、オーバーライドしています。抽象メソッドを宣言します。

public abstract double calc(double x, double y);

または、デフォルトの実装で具象メソッドを宣言します。

public double calc(double x, double y)
{
    // ...
}
于 2013-04-19T12:40:41.937 に答える
2

現在、calcメソッドはあなたの可能な値のそれぞれにしか存在しないため、コンパイルされませんが、自体enumには存在しません。そのため、あなたのコンパイラ (および私のもの) はそれを受け入れません。 Operation

したがって、typeでメソッドを定義する必要があります。多分このようなもの:

public abstract double calc(double x, double y);

列挙値 ( PLUSMINUSMULTIPLEおよびDIVIDED_BYそれぞれがそのメソッドを実装します。

于 2013-04-19T12:44:00.550 に答える
2
public double calc(double x, double y){}

と同じです

private double calc(double x,double y){}

calc()列挙型にメソッドを追加しない限り、 OperationJLSに従って:

Instance methods declared in these class bodies are may be invoked outside 
the enclosing enum type only if they override accessible methods in 
the enclosing enum type.

したがって、基本的にoprtisの型Operationと asには、Operation呼び出されるメソッドの宣言double calc(double x,double y)がないため、 を使用してメソッドを呼び出すことはできませんoprt。要するに、クラス本体で定義されたメソッドは、メソッドをオーバーライドして、外部からアクセスできるようにする必要があります。

于 2013-04-19T12:44:55.603 に答える