代码之家  ›  专栏  ›  技术社区  ›  mike

有没有一种方法可以在java中实现隐式类型转换或转换

  •  1
  • mike  · 技术社区  · 12 年前

    我想创建一个方法 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;
      }
    
    3 回复  |  直到 12 年前
        1
  •  4
  •   Mario Rossi    12 年前

    是的,这是有可能实现的。事实上,你在第二段代码中做到了。

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

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

        2
  •  0
  •   ZhongYu    12 年前

    为什么不直接使用 sign

    if (entry * sign.value > 0)
    
    
    
    enum Sign
    
        public final int value;
    
        3
  •  0
  •   Marcelo    12 年前

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

    public final class Sign {
        public final static int POSITIVE = 1;
        public final static int NEGATIVE = -1;
    
        private Sign() {
        }
    }
    

    然后你可以使用 Sign.POSITIVE Sign.NEGATIVE 用于您想要的操作。