#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
.