Нет никакого неявного преобразования от Nullable<bool>
до bool
. Там неявное преобразование от bool
до Nullable<bool>
, и это - то, что происходит (в терминах языка) к каждой из bool констант в первой версии. bool operator==(Nullable<bool>, Nullable<bool>
оператор затем применяется. (Это не вполне то же как другие снятые операторы - результат всего bool
, не Nullable<bool>
.)
, Другими словами, выражение 'fred == ложь' имеет тип bool
, тогда как выражение 'fred' имеет тип Nullable<bool>
следовательно, Вы не можете использовать его в качестве "если" выражение.
РЕДАКТИРОВАНИЕ: Для ответа на комментарии никогда нет неявного преобразования от Nullable<T>
до [1 110] и на серьезном основании - неявные преобразования не должны выдавать исключения, и если Вы не хотите null
быть неявно преобразованными в [1 112] много еще нет, который мог быть сделан.
кроме того, если бы там были неявные преобразования оба окольных пути, выражение как "nullable + не допускающий NULL-значения" очень сбивало бы с толку (для типов, которые поддерживают +, как [1 113]). Оба + (T?, T?) и + (T, T) было бы доступно, в зависимости от которого операнда были преобразованы - но результаты могли очень отличаться!
я - 100% позади решения только иметь явное преобразование от [1 114] до [1 115].
Я не уверен, имеет ли значение фактор GWT, но в целом:
boolean - это примитивный тип java, тогда как Boolean - это объект / ссылочный тип, который является оболочкой для логического
Преобразование между примитивами и такими объектами, как этот, известно как упаковка / распаковка.
Дополнительная информация:
http://javaeye.wordpress.com/2008/06/17/boxing-and-unboxing-conversion/
Почему коробка, спросите вы?
http: // java.sun.com/j2se/1.5.0/docs/guide/language/autoboxing.html
В Java есть примитивные типы (int, boolean, float и т. Д.), И каждый раз, когда вы хотите использовать их как экземпляр объекта, они заключаются в связанный тип класса. Например, логические значения обертываются логическими значениями, int как Integer и т. Д.
Это тоже имеет свои преимущества. boolean не имеет вспомогательных методов (поскольку это не класс), но Boolean имеет. Итак, если вы хотите преобразовать строку в логическое значение, вы можете попробовать Boolean.valueOf ("true").
Надеюсь, что это поможет.
Это довольно просто и то же самое для GWT и Java:
Поэтому, если вам не нужен NULL (например, когда вы загружаете поле из базы данных, и вы хотите, чтобы NULL отличался от false), используйте логическое значение.
В Java логическое значение
является литералом истина
или ложь
, а логическое значение
является объектная оболочка для логического
.
Редко есть причина использовать логическое
вместо логического
, за исключением случаев, когда требуется ссылка на объект, например как в List
.
Boolean
также содержит статический метод parseBoolean (String s)
, о котором вы, возможно, уже знаете.
Что касается GWT, в GWT они такие же, как и в java.
boolean является примитивом, а Boolean - в оболочке объекта.
Согласно документации по эмуляции GWT JRE ( http://code.google.com/webtoolkit/doc/1.6/RefJreEmulation.html ) эти методы поддерживаются Логический тип: Boolean (логическое), Boolean (String), parseBoolean (String), toString (логическое), valueOf (логическое), valueOf (String), booleanValue (), compareTo (Boolean), equals (Object), hashCode (), toString ( )
относительно разницы между типами объектов boolean и Boolean. Логические объекты могут находиться в 3 состояниях, поэтому это не совсем то же самое. Но если это имеет значение для GWT (с точки зрения производительности), я понятия не имею, я предполагаю, что это не имеет большого значения, поскольку компилятор GWT оптимизирует код, и большинство операций можно просто сопоставить с собственными логическими операциями javascript.
Но как обычно: чтобы быть уверенным, что вы должны измерить (и принять во внимание, что это может отличаться в зависимости от того, какой браузер / версия вы измеряете).
Тип объекта Boolean обычно не используется очень часто, поскольку собственный тип boolean более естественно (вы не
Поскольку логическое значение может быть нулевым, его можно использовать для отложенной загрузки.
if(hasRoots == null){
calculateRoots();
}