【问题标题】:Whats wrong with this boolean method?这个布尔方法有什么问题?
【发布时间】:2014-08-31 09:23:21
【问题描述】:

您好,我创建了这个方法。它的工作是接收一个整数 A,它可以是 10 或 30。如果值为 10,则返回 TRUE,否则返回 false。

public static boolean checkStatus(int a){
        if(a.equals(10)){
              return true;
        }
      return false;
    }

由于某种原因,我在 if(a.equals(10)) 条件下遇到编译错误,即 INT CANNOT BE DEREFERNCED。如果我没记错的话, .equals() 方法不是在这种情况下要走的路吗?

感谢您的帮助!

【问题讨论】:

  • 编译错误告诉你什么?
  • if(a.equals(10)) 是一个字符串比较。不适用于整数。请在您的 if 条件中遵循 a==10
  • @NarendraPal 不,这不是字符串比较,只是非法方法调用。即使sStrings.equals(10)也不是字符串比较,;它总是返回 false 而不进行任何比较。 equals 是一种可以应用于任何对象的方法,而不仅仅是字符串。
  • @ajb 是的!!!我错了!谢谢

标签: java methods boolean return equals


【解决方案1】:

Java 中的基元(intlongfloat 等)没有成员方法,所以调用

if (a.equals(10))

不会编译,因为您正在尝试取消引用原语。相反,您想使用 == 运算符来比较原始值:

if (a == 10)

并保留对非原始Objects 使用equals() 方法

【讨论】:

  • 您能否解释一下 .equals() 方法何时合适。我一直忘记这个:(谢谢!
  • @user3029345 比较对象时只应使用 .equals()。
  • @user3029345 我在答案的底部添加了一条注释。简而言之,equals方法属于Object宇宙超类,因此Java中的所有其他类,因为它们必须在其层次结构链中扩展Object,继承equals的某些版本。所有对象都应使用此方法进行比较,因为将对象与== 进行比较只会比较对象的引用,以查看引用是否指向内存中的同一位置(不完全,但足够接近)。
  • @user3029345 equals() 对于StringBigIntegerBigDecimal 和其他一些 Java 定义的类,应始终使用而不是 ==。对于其他对象,equals() 是合适的 if 类的两个不同实例以某种方式“相等”是有意义的。这并不总是有意义的——两个JComponents 相等意味着什么?当它确实有意义时,该类需要定义一个equals 方法(和hashCode)。有时你还想测试两个引用是否指向同一个对象;然后使用==。比较 null 时使用 ==
【解决方案2】:

您可以将equals 用于对象,但int原始 类型(a),而不是对象。

因此你需要这样的东西:

public static boolean checkStatus (int a) {
    if (a == 10)
        return true;
   return false;
}

或更短且更明智的(在这种情况下):

public static boolean checkStatus (int a) {
    return (a == 10);
}

(a) 纯粹主义者会争辩说,这证明 Java 并不是真正的面向对象语言,但那是因为他们是疯子 :-)

【讨论】:

  • +1 表示速记 (a == 10)。多余的 if 语句没用。
  • 只是好奇,OPs 案例没有自动装箱吗?
  • 包装盒在哪里?
  • @AntonH,自动装箱发生(例如)当您将int 传递给期望Integer 的函数时,或者当您将int 分配给Integer 变量时。 OP 的原始 if 声明都不是这些。请参阅docs.oracle.com/javase/tutorial/java/data/autoboxing.html 了解更多详情。
  • @paxdiablo 好的,谢谢您的信息。我一直以为是这样,但你每天都会学到新东西。
【解决方案3】:

你可以使用

public static boolean checkStatus(int a){
        if(a==10){
              return true;
        }
      return false;
    }

public static boolean checkStatus(Integer a){

        if(a.equals(new Integer(10))){
              return true;
        }
      return false;
    }

【讨论】:

  • 不确定我是否会在第二种情况下创建一个全新的对象,而您只能这样做 if (a.intValue() == 10)
【解决方案4】:

int 是 Java 中的原语,原语没有行为,也就是方法。

因此您不能在int 上致电.equals。所以这里的选项是使用==

public static boolean checkStatus(Integer a){
  return (a==10);
}

或将int 转换为Integer,这是一个包装类

public static boolean checkStatus(Integer a){
    return a.equals(10);
}

【讨论】:

    【解决方案5】:

    equals() 方法属于JavaObject 类,并且它必须属于override 每个对象类,例如String, Integer and MyObject(implemented class)。但是int 不是Java Object 并且那里没有equals() 方法。

    您可以将 == 与 int 值一起使用,您可以将代码简化如下。

    public static boolean checkStatus(int a){
        return a==10;
    }
    

    【讨论】:

      【解决方案6】:

      equals 主要用于非原始对象。

      == 用于基元。

      所以,你可以使用它

      public static boolean checkStatus (int a) {
          if (a == 10)
              return true;
         return false;
      }
      

      示例 1: 对于对象,如果equals方法被覆盖,那么“equals”方法将返回true。

      public class Employee {
          int id;
      
          @Override
          public boolean equals(Object obj) {
              Employee e = (Employee) obj;
              return id == e.id;
          }
      
          Employee(int id) {
              this.id = id;
          }
      
          public static void main(String[] args) {
              Employee e1 = new Employee(5);
              Employee e2 = new Employee(5);
              System.out.println("e1.equals(e2) is: " + e1.equals(e2));
              System.out.println("(e1 == e2) is: " + (e1 == e2));
          }
      }
      

      输出:

      e1.equals(e2) 是:true

      (e1 == e2) 是:

      示例 2: 对于对象,如果equals方法没有被覆盖,那么“equals”方法就像“=="

      public class Employee {
          int id;
      
          Employee(int id) {
              this.id = id;
          }
      
          public static void main(String[] args) {
              Employee e1 = new Employee(5);
              Employee e2 = new Employee(5);
              System.out.println("e1.equals(e2) is: " + e1.equals(e2));
              System.out.println("(e1 == e2) is: " + (e1 == e2));
          }
      }
      

      输出:

      e1.equals(e2) 是:false

      (e1 == e2) 是:

      这里的“equals”方法相当于“==”。所以,不要忘记重写对象的equals方法。

      【讨论】:

        【解决方案7】:

        你可以用整数类做这样的事情

          Integer x = 5;
          Integer y = 10;
          Integer z =5;
          Short a = 5;
        
          System.out.println(x.equals(y));  
          System.out.println(x.equals(z)); 
          System.out.println(x.equals(a));
        

        输出:

          false
          true
          false
        

        【讨论】:

          【解决方案8】:

          您当然可以将整数包装为:

          Integer i = new Integer(a);
          

          那么equals函数就可以和新的Integer对象'i'一起使用了。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-08-16
            • 1970-01-01
            相关资源
            最近更新 更多