kotlin как работает проверка логического значения с нулевым значением?

#kotlin #nullable #equality

#kotlin #nullable #равенство

Вопрос:

Наличие класса Config с логическим значением с нулевым значением sAllowed и интерфейсной функции возвращает конфигурацию с нулевым значением

 interface IConfig {
    fun getConfig() : Config?
}

class Config (var sAllowed: Boolean?=null)
  

и когда вы хотите использовать это логическое значение:

 var sAllowed = false
// some loop ...
    val config = iConfig.getConfig()
    if (config != null) {
        sAllowed = sAllowed || config.sAllowed == true
    }
  

но config.sAllowed == true переводится в:

 Intrinsics.areEqual(config.getsAllowed(), true);
  

и Intrinsics.areEqual(config.getsAllowed(), true);
является:

 public static boolean areEqual(Object first, Object second) {
    return first == null ? second == null : first.equals(second);
}
  

first.equals(second); это :

 public boolean equals(Object obj) {
    return (this == obj);
}
  

документ для equals(Object obj) — это Indicates whether some other object is "equal to" this one , а не равенство значений.

Звучит ли это так, что config.sAllowed == true проверяет равенство объектов, а не значение, или чего мне здесь не хватает?

      * The {@code equals} method for class {@code Object} implements
     * the most discriminating possible equivalence relation on objects;
     * that is, for any non-null reference values {@code x} and
     * {@code y}, this method returns {@code true} if and only
     * if {@code x} and {@code y} refer to the same object
     * ({@code x == y} has the value {@code true}).
     * <p>```
  

Ответ №1:

Это проверка равенства объектов. Однако посмотрите на equals() из Boolean.java

 public boolean equals(Object obj) {
        if (obj instanceof Boolean) {
            return value == ((Boolean)obj).booleanValue();
        }
        return false;
    }
  

При этом учитывается значение, заключенное в класс-оболочку.

 first.equals(second);
  

Будет вызываться equals на Boolean , а не Object поскольку first это Boolean .