Динамическая проблема вычисления оператора при сравнении строк - PullRequest
1 голос
/ 15 мая 2010

Я попробовал пример, приведенный в этой теме динамически создавать оператор if, используя BeanShell . Но это не работает нормально. Вместо использования переменной age в качестве целого числа, я использовал строку в следующем примере. Я получаю «отказ» в качестве ответа вместо «успеха».

Кто-нибудь может мне помочь?

/*
To change this template, choose Tools | Templates
and open the template in the editor.
*/

import java.lang.reflect.*;
import bsh.Interpreter;

public class Main {
  public static String d;

  public static void main(String args[])
  {
    try {
      String age = "30";

      String cond = "age==30";


      Interpreter i = new Interpreter();

      i.set("age", age);

      System.out.println(" sss" + i.get("age"));

      if((Boolean)i.eval(cond)) {
        System.out.println("success");
      } else {
        System.out.println("fail");
      }
    }
    catch (Throwable e) {
      System.err.println(e);
    }
  }
}

Спасибо, Мани

Ответы [ 5 ]

1 голос
/ 15 мая 2010

Вы должны выбрать либо числовое сравнение, либо сравнение строк. Это требует использования совместимого условия и типа для возраста.

Числовой:

  int age = 30;
  String cond = "age==30";

Строка:

  String age = "30";
  String cond = "age.equals(\"30\")";
0 голосов
/ 05 июня 2013

Строка сравнения с "==" в интерпретаторе bsh работает не так, как ожидалось.

Работает так: (скопировано по ссылке ниже)

    Beanshell handles '==' like java and not e.g. like JavaScript. That means you've got to use "equals" to compare instances.
    bsh % "abc" == "abc"; => true
    <b><i>bsh % "abc" == new String("abc"); => false</i></b>
    bsh % "abc".equals("abc"); => true
    bsh % "abc".equals(new String("abc")); => true

дополнительная информация здесь: https://code.google.com/p/beanshell2/issues/detail?id=86

Так что вы должны использовать ".equal ()" или скомпилировать свою собственную версию bsh, как я это сделал. (прочитайте полный выпуск выше)

0 голосов
/ 15 мая 2010

@ Мэтью Флэшен прав. Кроме того, вы можете упростить вывод следующим образом:

System.out.println(cond + " is " + i.eval(cond));

, который производит

возраст == 30 верно

0 голосов
/ 15 мая 2010

Вы используете == для сравнения типов строк. Попробуйте использовать age.equals("30") вместо.

РЕДАКТИРОВАТЬ : чтобы показать, как работает

Если вы используете это как определение cond:

String cond = "age.equals(\"30\")";

Выход:

 sss30
success

В ответ на вопрос об использовании =="30" ответ на этот вопрос:

Если ваш String age интернирован, потому что это, например, константа времени компиляции, то может быть истинным.

final String age = "30";

Однако, если вы явно new String или иначе не интернированы, то это будет ложь.

String age = new String("30");

Вы можете запустить оба примера, чтобы убедиться в этом. Возможно - вы можете получить fail для обоих.

Теперь, просто потому, что интернирование существует, не означает, что когда-либо нужно полагаться на него для сравнения String типов. Оператор == должен использоваться только для сравнения примитивов друг с другом и для сравнения ссылочных типов, чтобы увидеть, указывают ли они на один и тот же объект, поэтому для ссылочных типов мы можем сказать, что он видит, если два объекта идентичны вместо равно .

Иногда, благодаря магии JVM и JDK, String и другие примитивные оболочки, такие как Integer, могут быть сопоставимы с ==, но ситуации для этого ограничены и не надежны.

0 голосов
/ 15 мая 2010

Когда вы сравниваете два объекта с помощью оператора ==, вы сравниваете две ссылки . По сути, вы спрашиваете, относятся ли два разных имени к одному и тому же объекту в памяти.

Для сравнения фактических значений объектов необходимо использовать метод equals(). Это очень важно понимать в Java.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...