1. Java / Говнокод #17066

    +79

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    Object o1 = true ? Integer.valueOf(1) : Double.valueOf(2.0);
    Object o2;
    
    if (true) {
    	o2 = Integer.valueOf(1);
    } else {
    	o2 = Double.valueOf(2.0);
    }
    
    System.out.println(o1);
    System.out.println(o2);

    Такие вот в Java интересные типы-обёртки.

    Проверить себя: http://ideone.com/BrhREq

    Источник: http://java.dzone.com/articles/10-things-you-didnt-know-about

    Запостил: someone, 05 Ноября 2014

    Комментарии (79) RSS

    • Если почитать Пирса, то становится понятно, что выражение (if _ then _ else):T должно быть типа T. Т.е. интежером ему уже никогда не быть. Либо в Яву нужно завезти варианты.
      Ответить
      • показать все, что скрытоНо разве в жабе Integer можно кастануть в Double?
        Ответить
        • показать все, что скрытоПиздец. Это оказывается частный случай такой для тернарника и обёрток над числами - если типы разные, но их можно разбоксить в число, то он одно из них разбоксит и забоксит в тип другого аргумента.
          Ответить
          • Number же, общий надтип. А всё приводится к double.
            На самом деле понятнее будет, если рассмотреть похожесть данного кода.
            >Object o1 = true ? 1 : 2.0;
            >Object o1 = (1+2.0);
            http://ideone.com/G8o52J
            В обоих случаях неявная питушня в double и неявный опять-таки автобоксинг в Double.
            Ответить
            • показать все, что скрытоБыл бы там каст в Number - реальный класс остался бы Integer'ом. А здесь именно что разбоксили Integer, кастанули в double, и забоксили в Double.
              Ответить
              • >Был бы там каст в Number - реальный класс остался бы Integer'ом.
                Не. Это больше к тому что говорит wvxvw
                > что выражение (if _ then _ else):T должно быть типа T
                В смысле как надо было сделать. Вывести общий надтип.
                Ответить
            • показать все, что скрытоВот! Стоило притащить в язык богомерзкое неявное приведение типов - и сразу всякая питушня попёрла.
              Ответить
              • Этим приколы с Number не ограничиваются
                Я вроде уже приводил пример, какой будет размер у множества
                Set<Number> s=new TreeSet<Number>();
                		s.add(1.0f);
                		s.add(1.0);
                       System.out.println(s.size());
                http://ideone.com/OwM9az
                Ответить
                • показать все, что скрытоНу, наверное, 2, т.к. первый забоксится во Float, а второй в Double?

                  Да number то не виноватый... Корень всех зол - богомерзский неявный каст, сиречь молвить автобоксинг.
                  Ответить
                • показать все, что скрытоException in thread "main" java.lang.ClassCastException: java.lang.Float cannot be cast to java.lang.Double
                  WTF?! Видимо equals упал?
                  Ответить
                  • >WTF?!
                    Подленькая задачка
                    >Видимо equals упал?
                    Не compareTo(T other), где T - наш тип.
                    equals(Object), потому первое что в equals пишут после сравнения ссылок, это instanceof.
                    Ответить
                    • показать все, что скрытоВот спрашивается, нахуя они вообще притащили это говно этот сахарок в виде автобоксинга и испохабили сложение и тернарник, если при этом сравнить Float и Double всё равно нельзя?

                      == вообще не компилится. equals возвращает false (тип разный), а compareTo вообще падает.

                      P.S. А еще автобоксинг не пашет для чего-то кроме оберток над примитивами, а перегрузку операторов не завезли. Поэтому юзеры BigDecimal и каких-нибудь Point'ов плачут горькими слезами.
                      Ответить
                      • нельзя_так_просто_взять_и_сравнить_два_Numbera_в_жаве.jpg
                        То же касается массивов.

                        Правильный способ такой:
                        return 		Double.doubleToLongBits ( a.doubleValue () ) 
                        	==	Double.doubleToLongBits ( b.doubleValue () );
                        Ответить
                        • показать все, что скрытоНельзя_так_просто_взять_и_сравнить_хоть_что_нибудь_в_жаве.jpeg
                          Ответить
                          • >Нельзя_так_просто_взять_и_сравнить_хоть _что_нибудь_в_жаве.jpeg
                            Стопудово! Что-то через ==, что-то через equals, что-то через Arrays.equals, что-то через еще какую-то жопу:

                            return  ( isInt(a) && isInt(b)) ?
                            	a.longValue ()==b.longValue () //защита от плавающей питушни
                            	: 	Double.doubleToLongBits ( a.doubleValue () ) 
                            	==	Double.doubleToLongBits ( b.doubleValue () );
                            
                            boolean isInt(Number num) 
                            {
                            	return (
                            	        num instanceof Integer
                            	||	num instanceof Byte
                            	||	num instanceof Short
                            	||    num instanceof AtomicInteger
                            	||	num instanceof Long
                            	||	num instanceof AtomicLong
                            	);
                            }

                            Короче я сам не знаю. Где-то тут уже это обсуждали.
                            ε по желанию.
                            Ответить
              • Тут оно не более "неявное" чем в Хаскеле, именно в этом случае, не вцелом в Яве. Тернарник в этом случае эквивалентен хаскелевому if-then-else. Попробуй и посмотри какой тип он выведет для двух типов с общим надтипом.
                Ответить
                • показать все, что скрытоДа тернарник всё правильно делает. Не виноватый он. Под неявным приведением имеется в виду именно магический боксинг\анбоксинг примитивов в их обёртки из java.lang.
                  Ответить
              • Вообще корень зла - в разделении на примитивные и объектные типы, от которого отказались в .NET и правильно сделали. (Да, в .NET есть боксинг, но он прозрачный.)

                И в JavaScript зачем-то притащили эти жабовские костыли. Видимо, в то время не представляли, что можно ещё как-то по-другому.
                Ответить
                • >в разделении на примитивные и объектные типы, от которого отказались в .NET и правильно сделали
                  Чего вы такое говорите? "Отказались", "правильно сделали", "есть боксинг, но он прозрачный".
                  Да боксинг везде прозрачный, его суть в том чтоб сделать конверсию прозрачной, то бишь неявной.

                  По мне в шарпе еще хуже сделали. int - примитив, Int32 - тип, int? - nullable. Больше сахара, и больше граблей...
                  И точно такие же неявные конверсии, как и в жабе:
                  http://ideone.com/8wb3TE
                  Насчёт женериков - это был единственный способ сохранить обратную совместимость.
                  Ответить
                  • > По мне в шарпе еще хуже сделали. int - примитив, Int32 - тип, int? - nullable.

                    С какого перепоя? В .NET нет примитивных типов. Там есть value types, но это не то же самое. И System.Int32 - абсолютно то же самое, что и int. В отличие от Java, где int и Integer - это две большие разницы.

                    Кстати, мне в Жабе не хватает nullable-типов. Например, если поле в базе INTEGER и может быть NULL, то в JPA приходится его объявлять как Integer. Со всеми вытекающими. А вот в .NET NHibernate для такого понимает int?.
                    Ответить
                    • Вы правы: вауле тайпы это теже классы (а не примитивы)
                      разница только в том что они храняца на стеке.
                      Ответить
                    • >Кстати, мне в Жабе не хватает nullable-типов.
                      Integer - это nullable int.
                      >Например, если поле в базе INTEGER и может быть NULL, то в JPA приходится его объявлять как Integer.
                      И что тут плохого? В чем разница с int? ?
                      Ответить
                      • Тонкие моменты с автобоксингом. Например, всякие заморочки с == и equals. По == не сравнишь, по equals в общем случае тоже нельзя, ибо весь смысл использования Integer в том, чтобы поле типа Integer могло быть null'ом. А уж чтобы сравнить два Integer'а, каждый из которых может быть null, приходится писать портянки вроде

                        a.getId() == null ? b.getId() == null : a.getId().equals(b.getId())


                        Хорошо хоть в Guava и JDK 7 есть Objects.equal[s]().
                        Ответить
                        • То есть на самом деле проблема не в отсутствии nullable, а в желании перегрузки ==?
                          Ответить
                  • в CLR нет понятия "int".
                    Там есть ТОЛЬКО System.Int32.

                    "int" это синтаксический сахер C#, который все равно превращается в Int32.

                    "int?" (нулабл) это сахар для Nullable<System.Int32>. Такая хрень в которой указатель хранится.

                    Конечно есть определенная магия с тем что Int32 может хранится на стеке, а в случае Nullable<Int32> он уже хранится в куче (а сам Nullable может и на стеке) но это и так понятно.

                    Еще раз: в .NET НЕТ int, НЕТ int?, а есть только Int32 и Nullable<T>.

                    Почитайте Рихтера CLR via C#.
                    Ответить
                    • >"int" это синтаксический сахер C#, который все равно превращается в Int32.
                      А я о чем говорю?!
                      >Еще раз: в .NET НЕТ int, НЕТ int?
                      Только сахара напилили, а так всё тоже. Ну разве что обратная совместимость (вернее её отсутствие) позволило сделать женерики на Int32 и прочих стековых "примитивах".

                      > а есть только Int32 и Nullable<T>.
                      В жабе есть примитивный int - C# аналог Int32(int) и Integer - C# аналог Nullable<T> (int?)
                      Только сахара добавили, а так всё абсолютно тоже.
                      И баги те же. И неявные конверсии те же.
                      Ответить
                • Примерно двадцать лет до того, как зачали ж.скрипт, человечество уже умело встраивать числа в указатели. Что произошло в Яве и ж.скрипте результат подхода "лучше сделать реализацию простой, но плохой, чем сложной, но хорошей". Для языка уровня ж.скрипта не нужны вообще байтоебские упражнения с арифметикой по модулю, а вот безразмерные целые и бесконечно точные (псевдо)вещественные как-раз таки очень бы были кстати.

                  Но ведь как все было? Написали говноязык за неделю, и еще столько же на интерпретатор. И потом двадцать лет плачут кровавыми слезами о том, как херово получилось.

                  ЗЫ. Дуглас Крокфорд где-то рассказывал о разных предложениях поменять числа в ж.скрипте на что-то более вменяемое. Например, Intel вроде, или IBM предлагали внедрить вещественные с десятичной экспонентой, но такой заумный формат, что его отказались реализовывать. Рассказывал он об этом в контексте того, что предлагал упрощенный формат с десятичной экспонентой. Но судя по всему, числа в ж.скрипте так и останутся недоделаными, пока язык не помрет, а все "улучшения" сведутся к тому, как круто можно будет let вместо var писать, или что-то похожее.
                  Ответить
                • показать все, что скрытоНифига они не отказались. Только сделали примитивным string и struct.
                  Ответить
              • бугага, принцип KISS в действии;)))
                Ответить
      • Кстати проблемы жавы с дуплением типов в тернарнике на этом не ограничиваются:
        https://bugs.openjdk.java.net/browse/JDK-8044053
        http://stackoverflow.com/questions/22509488/generics-compilation-error-with-ternary-operator-in-java-8-but-not-in-java-7
        Ответить
    • Для приличия бы еррор кинуть.
      Ответить
    • а я не был удивлен. Все логично

      http://ideone.com/UWOJQu
      Ответить
    • Столлман в шоке, мелкософтовцы одумались
      http://www.hanselman.com/blog/AnnouncingNET2015NETAsOpenSourceNETOnMacAndLinuxAndVisualStudioCommunity.aspx
      http://blogs.msdn.com/b/dotnet/archive/2014/11/12/net-core-is-open-source.aspx
      Ответить
      • показать все, что скрыто> We are building a .NET Core CLR for Windows, Mac and Linux and it will be both open source and it will be supported by Microsoft. It'll all happen at https://github.com/dotnet.

        Моно наконец-то можно закапывать?
        Ответить
        • ха-ха, только-только я тут вещал о том что моно не может быть стабильно ибо разаработчики моны не могут влиять на разработку стандарта)
          И МС меня услышал.

          Впрочем, они говорят
          "We intend to build a public working group between us and the Mono community once we have enough code out there."
          ===========
          Впрочем, основные няши вроде WPF, WF, XAML и WCF все равно никуда от MS не уйдут, равно как и веб разработка (никто IIS-то портировать не собирается). Так что моно может и вкопают, а вот GtkSharpы всякие -- не.

          И будет в .NET как в жабе: восемь веб-фреймворков на выбор, парочка гуи, шесть разных Dependency Injection итд
          Ответить
          • показать все, что скрытоASP.NET таки обещают.

            > IIS-то портировать не собирается
            А зачем? Можно подумать, что у ASP.NET настолько тесная интеграция с кишками IIS, что его никак нельзя привернуть к какому-нибудь апачу или нгинксу... Емнип, у апача даже был модуль для ISAPI dll'ок.
            Ответить
            • Ну вообще довольно тесная.
              Наверное можно будет его прикрутить, но писать много кода придется. Потому что сам веб-сервер он не на .NET же. Я вообще не очень понимаю как это будет работать, надо почитать.

              Скорее всего будет какая-то спека (как спека сервлет-контейнера в джаве) которую надо будет реализвать и тогда на тебе заработает asp.net
              Ответить
              • показать все, что скрытоДа там же вроде самый обычный isapi модуль, которому IIS форвардит запросы...
                Ответить
                • В шестерке так и было (IIS вообще ничего не знал про .net и тупо отдавал всё ISAPIшному модулю). В семерке там появились пулы приложений, и стало всё сложнее.
                  Кроме того часть обработки http унесли в драйвер (http.sys), но это видимо такая странная оптимизация перформанса.

                  Aspnet_isapi.dll, энивей, исходников не имеет, и на линухах не подымица ибо является Win32DLL и наверняка еще юзает какую-нить часть Win32API.

                  Вики говорит:
                  " ASP.NET can be run with Mono using one of three options: Apache hosting using the mod_mono module, FastCGI hosting, and XSP."

                  Но я всё равно почему-то не верю что там всё хорошо работает.
                  Ответить
                  • показать все, что скрыто>Кроме того часть обработки http унесли в драйвер (http.sys)
                    Он винду уронить сможет?
                    Ответить
                    • показать все, что скрытоВ нем вроде даже какие-то уязвимости затыкали.

                      Рискованная херня, на самом деле.
                      Ответить
                    • Сможет, как и всякий драйвер. Но MS постарался его вылизать.

                      Вообще когда часть GUI унесли в kernel space (было это во времена WinNT4) все стали смеяться и говорить что теперь всё будет падать.
                      А Руссинович после говорил "но ведь без гуи вы все равно ничего не сможете делать на виндусе, так что ничего страшного что унесли, зато стало быстрее работать, нет дурацких прыжков user/kernel".

                      Но вообще архитектура винды это винигрет со спагетти. Один csrss чего стоит!
                      Ответить
                      • показать все, что скрыто> Но вообще архитектура винды это винигрет со спагетти.
                        Можно подумать, что в линухе с ее иксами лучше... Там тоже треш угар и содомия, если покопаться.
                        Ответить
                        • Ниховая ахитектура куда более внятная потому что во-первых "делай одну вещь и делай ее хорошо", во-вторых потому что ее надо презентовать коммунити, а значит надо делать как-то так чтоб не только ты ее понимал, а MS пофиг впринципе, и наконец потому что надо быть POSIX, а интерфейс всегда получается лучше, если у него несколько реализаций (ну POSIX ОС много).

                          Иксы все же не часть линухов, и архитектура у них забавная конечно ("на моей слабой писи выполняется сервер иксов, а на мощном сервере работает их клиент"), но все же она более внятная и хорошо документирована.

                          Ну тоесть таких вот кромешных фейлов как с WinSta0 или тем же CSRSS там все же почти нет.
                          Ответить
                          • показать все, что скрытоАга, клиент-сервер ахуенно нужен на десктопе.

                            >"на моей слабой писи выполняется сервер иксов, а на мощном сервере работает их клиент"
                            VNC, вид сбоку?
                            Ответить
                            • >>на десктопе

                              Ну во-первых он всё же работает не только поверх IP, но и через unix domain sockets например, так что накладные расходы не велики. Это обычный IPC, довольно быстрый тащемто. А во-вторых на винде часть Win32API тоже реализована в уже упомянутом тут CRSS (угадайте, как расшифровывается!) с которым клиент общается по недокументированному протоколу LPC. Да и вообще много чего реализовано в винде через RPC, например добрая половина оснасток (mmc). Сделано это чтоб можно было одинаково управлять сервисами или девайсами как локально так и удаленно.

                              >>VNC
                              Не совсем. VNC сервер захватывает экран, и шлет его картинкой клиенту. От клиента получает нажатия клавиш и движения мыши.

                              А в иксах сервер работает с видео-картой чтоб отображать картинку и с клавой мышью чтоб получать их нажатия. А клиент присоединяется к серверу и дает команду "нарисуй то-то". Сервер создает для клиента окно, хромирует его настроенным оконным менеджером, и рисует там круг и передает клиенту нажатия клавы.

                              Тоесть есть вот икс сервер у меня на экране, и каждая программа (калькулятор, IDE итд) это его клиенты.

                              Это выглядит странно: я у себя запускаю сервер, а на удаленной машине (например по SSH) запускаю тяжелую программу, он использует ресурсы той машины, а аутпут шлет мне по сети прямо на экран)
                              Ответить
                              • показать все, что скрыто>Да и вообще много чего реализовано в винде через RPC, например добрая половина оснасток (mmc).
                                Но не гуй же.

                                >Это выглядит странно: я у себя запускаю сервер, а на удаленной машине (например по SSH) запускаю тяжелую программу, он использует ресурсы той машины, а аутпут шлет мне по сети прямо на экран)
                                А теперь в джвух словах разница с VNC/Teamviewer/etc
                                Ответить
                                • >>А теперь в джвух словах разница с VNC/Teamviewer/etc

                                  Пожалуйста:

                                  VNC (RFB)/Radmin/etc:
                                  КЛИЕНТ ШЛЕТ: нажатие клавиш
                                  КЛИЕНТ ОЖИДАЕТ: картинку экрана

                                  X11 (X Windows Core System Protocol):
                                  КЛИЕНТ ШЛЕТ: комманды на отрисовку чего-либо в окне, эвентны окнам
                                  КЛИЕНТ ОЖИДАЕТ: нажатия клавиш

                                  И примитивы более высокоуровневые (не просто картинка а понятие окна и евента) и архитектура наоборот)

                                  Есть еще RDP (ака терминал ака ремоут десктоп) у MS, там все и вовсе по-третьему (кстати, довольно элегантно, на понятиях станций и сессий, и потому он обычно быстрее VNC)
                                  Ответить
                              • > хромирует его настроенным оконным менеджером, и рисует там круг и передает клиенту нажатия клавы.
                                Что означает термин "хромирует"? Это какой-то перевод, или окно по умолчанию заливают блестящей текстурой?

                                > Это выглядит странно: я у себя запускаю сервер, а на удаленной машине
                                После X-макросов и коллбеков - не странно :)
                                Ответить
                                • Рисует вокруг окошка рамочку и кнопочки. Делает, так сказать, лук энд фил. В некоторых фреймворках это называется "хром" (собссно название браузера именно этот факт и обыгрывает).
                                  Ответить
                                  • А возник термин «хром», вероятно, в проекте Mozilla, потому что уже в первых браузерах на Gecko была одноимённая директория, одноимённая схема URI и даже соответствующие места в документации.

                                    Из-за этого, когда впервые заговорили о браузере «Хром», я не мог понять, о чём речь. Как можно рамочку вокруг страницы назвать браузером?
                                    Ответить
                                    • показать все, что скрыто> Как можно рамочку вокруг страницы назвать браузером?
                                      Но ведь первые хромы выглядели и работали именно как рамочка для страницы! В них даже кеша не было.
                                      Ответить
                                      • Ещё при отрывании вкладки от окна страница перезагружалась.
                                        Ответить
                          • показать все, что скрыто> Ниховая ахитектура куда более внятная
                            Пока к ней не начали прикручивать OpenGL, методы ввода для русского, японского и арабского и прочие никому не нужные вещи... После этого архитектура превратилась в лапшу.
                            Ответить
                            • Проводя аналогию с виндой, должно было быть так: драйвер opgl.so реализует opengl в ядре, а демон japard висит в памяти и реализует половину японского и немного арабского. Вторую половину реализует arb.so который общается с демоном по непонятному протоколу) В никсах же не так, я надеюсь?
                              Ответить
                              • показать все, что скрытоРамки для окон рисуют и таскают отдельные демоны, которые цепляются к Х. Для IM несколько протоколов и соответствено демонов + сами иксы немного умеют переключать раскладки. Все это с горем пополам склеено и обмотано изолентой. Короче то еще осиное гнездо...

                                P.S. Когда в убунте пытались причесать методы ввода - запороли переключение раскладки по одним модификаторам (ктрл-шифт, альт-шифт и т.п., короче самые нужные).
                                Ответить
                      • показать все, что скрыто>Сможет, как и всякий драйвер.
                        А нафига лишнее барахло тащить в дрова? И, кстати, в винде еще не появились драйвера, которые не утягивают с собой винду?
                        Ответить
                        • Чтобы быстрее работало)

                          Появились конечно. На третьем кольце защиты работают UMDF драйвера начиная с висты. В ядре сидит класс-драйвер, а пользовательские драйверы работают с ним через (кажется) COM.

                          Их падение не приводит к BSODу, но скорость их конечно оставляет желать лучшего.
                          Ответить
                      • говорят драйвера звуковух унесли в юзерспейс. а гуи не вернули туда же?
                        Ответить
          • показать все, что скрытоНа видне останется гуй, один хуй крепко завязанный на винду, и что еще? Зато остальное можно использовать как современную жаву.
            Ответить
          • Всего восемь? Как бы не так. Десятки.
            Ответить
      • Ну если это будет GPL (а не просто опенсурс типа апачи/бзд) то Столлман наверное поприветствует.
        Иначе будет переписывать)
        Он даже сану не доверял, поднял бучу и стал хотеть OpenJDK.
        Ответить
        • показать все, что скрытоА апачи/бзд чем плохи? Они плохи только для изначального разработчика и контрибьютеров т.к. любой может невозбранно спиздить их код и переопубликовать под GPL или вообще проприетарной лицензией. А для конечного потребителя они даже лучше, чем GPL - меньше ограничений.
          Ответить
          • Они ничем не плохи, но Столлман уважает только GPL, и требует чтоб всё было именно GPL. Тоесть просто бесплатности и открытости сырцов ему мало будет>

            В бзд ты можешь показать исходный код, а можешь и нет. А в GPL ты обязан. Причем как только ты слинковался с либой GPL, так сразу надо всему GPL становиться. Потому враги Столлмана часто сравнивают GPL с раком
            Ответить
            • показать все, что скрытоПоэтому для либ обычно всё же юзают LGPL (кроме сраной readline).

              P.S.
              - форкаем проект M$ на гитхабе
              - меняем лицензию на GPL
              - ???
              - профит
              Ответить
              • А потом MS говорит "а вот для этого класса я сырцов не дам, дам только бинарник" и всё)

                Хотя чего загадывать, надо просто подождать как это работать будет
                Ответить
                • показать все, что скрытоНу на GPL M$ уломать однозначно не выйдет. Они ведь тогда вообще весь-весь-весь софт на дотнете должны будут под нее перелицензировать... И останутся у разбитого корыта.

                  LGPL - теоретически возможно, т.к. кабальных ограничений не накладывает, и сосуществование с бинарниками не запрещает, но скорее всего тоже не будут.
                  Ответить
                  • Так. Что-то на меня напал маразм и я не понимаю: Они делают Open Source стандартную библиотеку и фреймворки или реализацию CLR?

                    Потому что если толкьо фреймворки и стандарту либу (код на C#) то mono не сдох, потому что CLR-то кто-то должен гонять под линух.

                    Если же они делают реализацию CLR под линух (код на сях) (ну как jvm есть под разные ос) то надо говорить не только об опенсурсе, а о очень серьезной переделке, потому что код под POSIX и Win32API он очень разный всё таки:)
                    Ответить
              • Поэтому они откроют код под лицензией не дающей перевести под GPL.
                Одной из этих двух, наверное?
                http://www.microsoft.com/en-us/openness/licenses.aspx
                Ответить
      • Да не ведитесь, тут явно какая-то патентная подъебка.
        Ссылки не читал.
        Ответить
    • >Такие вот в Java интересные типы-обёртки.
      >Проверить себя: http://ideone.com/BrhREq
      У меня всё нормально работает:
      Object o1 = isnull(
      			Double.valueOf(2.0),Integer.valueOf(1)
              );
      		System.out.println(o1.getClass());//	class java.lang.Double
               o1 = isnull(
      			Integer.valueOf(1),Double.valueOf(2.0)
              );
      		System.out.println(o1.getClass());//class java.lang.Integer
      	}
      	public static <T>
      	T isnull(T a,T b)
      	{
      		return (null!=a) ? a: b; 
      	}
      http://ideone.com/EzBv2Y
      Что я делаю не так?
      Ответить
    • как из Int стал Double ?
      Ответить
    • показать все, что скрытоКЛИЕНТСКИЕ БАЗЫ для всех кто много продает (для юрлиц и физлиц)! Узнайте подробнее! Skype: prodawez390 Email: [email protected] Whatsapp: +79139230330 Viber: +79139230330 Telegram: +79139230330
      Ответить

    Добавить комментарий