1

我想创建一个enum在计算中直接使用并使用它的方法

  private static int getEntries(List<Integer> vector, Sign sign)
  {
    //assert isPrimitiveTypeCompliant(vector) : "Vector has null components!";
    int entries = 0;

    for (Integer entry : vector)
      if (entry * sign > 0) // does not compile
        entries++;

    return entries;
  }

我想…… 这样是可能的,因为我假设System.out.println(Object)隐式类型转换也是如此。它没有,它使用以下方法:

 public void println(Object x) {
        String s = String.valueOf(x);
        synchronized (this) {
            print(s);
            newLine();
        }
    }

 public static String valueOf(Object obj) {
    return (obj == null) ? "null" : obj.toString();
    }

问题

那么有可能在java中实现这一点吗?或者这是保留给C++运营商并重载的运营商?常见的解决方法是什么?完成工作的实用程序/适配器类?


顺便说一句,我最终采用了这种方法

  private enum Sign
  {
    POSITIVE(+1), NEGATIVE(-1);

    private int sign;

    private Sign(int sign)
    {
      this.sign = sign;
    }

    public int process(int n)
    {
      if (n * sign > 0)
      {
        return n;
      }
      return 0;
    }
  }

  private static int getEntries(List<Integer> vector, Sign sign)
  {
    //assert isPrimitiveTypeCompliant(vector) : "Vector has null components";
    int entries = 0;

    for (Integer entry : vector)
      entries += sign.process(entry);

    return entries;
  }
4

3 回答 3

4

是的,有可能实现它。事实上,您在第二段代码中已经做到了。

Java 没有运算符重载或隐式转换(除了数字转换和“扩大”类型转换)。所以,没有办法允许类似的语法entry * sign(除了你使用的那个)。

你是什​​么意思的解决方法?这不是问题。这是一个语言设计决策。而且您已经成功地掌握了适当的 Java 习惯用法。

于 2013-08-20T14:54:30.707 回答
0

为什么不直接使用 int 值sign

if (entry * sign.value > 0)



enum Sign

    public final int value;
于 2013-08-20T14:53:51.973 回答
0

我认为对于这种情况,使用最终静态变量会更好。

public final class Sign {
    public final static int POSITIVE = 1;
    public final static int NEGATIVE = -1;

    private Sign() {
    }
}

然后您可以使用Sign.POSITIVEandSign.NEGATIVE进行您想要的操作。

于 2013-08-20T14:57:56.850 回答