Як перемагати з Java | Відеозапис вебінару для ЗСУ 🇺🇦

Поділитися
Вставка
  • Опубліковано 20 вер 2024

КОМЕНТАРІ • 22

  • @Bobocode
    @Bobocode  11 місяців тому +2

    🙏🏼 Дякую за Ваші донати: send.monobank.ua/jar/3tSN5fDiMv
    💳 Номер картки банки: 5375 4112 0850 2919

  • @5-226
    @5-226 11 місяців тому +6

    Найкращий канал по Java який я знаходив. Дякую за ваш контент!

    • @Bobocode
      @Bobocode  11 місяців тому +1

      Дякую за таку високу оцінку! 🙏

  • @AlexSmith-oe6pr
    @AlexSmith-oe6pr 11 місяців тому +1

    Як завжди вдячність автору, шикарний контент, поєднання глибини + цікаві практичні приклади, краще що є по Java в українському UA-cam. Дуже хочеться чути щось подібне від кандидатів на технічному інтервʼю.
    Вже більш як 2+к переглядів, контент не для початківців, а банка все ще не закрита...

  • @СергійСтоленський
    @СергійСтоленський 11 місяців тому +5

    Дуже класне відео. Дякую що все так ретельно пояснюєте

    • @Bobocode
      @Bobocode  11 місяців тому +2

      Дякую за коментар і за донат! 🙂

  • @OleksandrKhrystenko-m6o
    @OleksandrKhrystenko-m6o 11 місяців тому

    Топчик 👍

    • @Bobocode
      @Bobocode  11 місяців тому

      Дякую! 🤩

  • @sku796
    @sku796 11 місяців тому +1

    Щодо стирання типів. 29:44. Тут краще пояснити наступним чином. Коли у нас є доступ до коду (через рефлексію) де оголошується конкретний тип дженерика, - тобто там, де тип T уже фіксується, і замість List у нас List - то ми можемо витягнути інформацію про тип дженерика, фактично "розпарсивши" цей клас через рефлексію. А там, де в нас намає фіксації типу - наприклад: T[] createArray() чи у виразах як-то if(x instanceof(List)), де намає доступа через рефлексію -- ми цю інформацію отримати не можемо.

  • @ArchonLicht
    @ArchonLicht 11 місяців тому

    Далеко не всі generic-и стираються. Локальні змінні - так. Але поля і параметри методів - мають в runtime інформацію про generic-и, яку можна отримати через reflection.

    • @Bobocode
      @Bobocode  11 місяців тому

      Підчас компіляції стираються абсолютно всі дженеріки. Якщо не вірите - подивіться байт-код. Те, про що ви кажете - це метадані. Так, інформація про те, якими були параметри типу і аргументи типу зберігається в метаданих класу і доступна через рефлексію, але сам тип в коді завжди стирається до верхньої межі.
      До речі, відповідні приклади з рефлексією я також показував.

    • @ArchonLicht
      @ArchonLicht 11 місяців тому

      @@Bobocode Метадані в даному випадку про дженеріки - про це і мова що вони залишаються.
      Я бачу вже ваш приклад - написав коментар подивившись першу частину. Ви трохи суперечливо пояснюєте, складається враження що вся інформація стирається повністю.
      Те, що на рівні байт коду є об'єкт а не якийсь конкретний тип це мало що говорить - в кінці кінців на рівні машкодів потім немає типів, а є лише пам'ять і реєстри.

    • @Bobocode
      @Bobocode  11 місяців тому

      @@ArchonLichtдобре, що ми розібралися ;)

    • @sku796
      @sku796 11 місяців тому

      Дженерики стрираються. Коли мова йде про стирання типів -- мова саме про рантайм типи. А Ви плутаеєте інформацію про *типи* *змінних* - які теоретично можна витягнути через рефлексію (але не завжди, і не найшвидшим чином ) - з реальними рантайм *типами* *даних* . В джаві маючи лише дані, ми ніяк не можемо визначити їх 'дженерик' тип -- чи то instanceof Processor, чи instanceof Processor. Коли ви говорите про поля і параметри методів -- ви переходите до рефлексії і оголошених (declared) типів -даних- контейнерів а вони можуть дуже сильно відрізнятись від рантайм типів даних, які зберігались в цих контейнерах. Крім того, ви навіть доступу до declared типу можете не мати. Наприклад, коли пишете бібліотеку, яка буде працювати з класами, які, можливо, ще взагалі ніхто не написав.
      Для прикладу, якщо у вас буде поле List p = new List, то інформацію про тип Circle ви ніяк не витягнете і, відповідно, не зможете зробити десь у себе new T(). максимум зарезолвите T як AbstractFigure з якою new немає сенсу робити, та й джава не дозволить.
      Крім того, не всі поля/методи мають в рантайм інформацію про дженерики. Приклад: void doSomething(T param)
      В мовах, де інформація про тип не стрирається (С#) ви можете спокійно визначити рантайм тип дженерик- змінної, навіть якщо вона прийшла до вас як Object, тобто ось таке: Boolean isStringProcessor(Object o){ return o.GetType() == typeof(List)} там буде працювати. Та й там звичайне new T() працює без усякої рефлексії.

    • @ArchonLicht
      @ArchonLicht 11 місяців тому

      @@sku796 Я знаю що стирається, що - ні. Ніяких «теоретично» - інформація про дженеріки у класів, в тч для приватних полів, зберігається, і може бути отримана рефлекшном. Не зберігається зовсі нічого лише для локальних змінних.
      Те, що в байткоді немає дженеріків, не означає що в рантаймі взагалі нічого немає. А автор спочатку говорить, що «все стирається», а потім сам же показує, що не все.

  • @BCEMCPATb
    @BCEMCPATb 11 місяців тому +2

    Щоб це все розуміти який рівень потрібно? Цеж не джунівський рівень чи я помиляюсь?

    • @Bobocode
      @Bobocode  11 місяців тому

      А з чого ви взяли, що це має бути джунівський рівень? Bobocode - це школа для досвідчених інженерів, відповідно більшість відео і завдань зроблені для досвідчених інженерів і потребують відповідного рівня.

    • @BCEMCPATb
      @BCEMCPATb 11 місяців тому +6

      @@Bobocode я просто сподіваюсь що маю знання на джун позицію а тут відео де я не доганяю і мене аж впіт кинуло. Тому і запитав. Просто знаю що ви багато пояснюєте для початківців і подумав що рівень так виріс. Дякую за відповідь, аж від сраки відлипло.))

    • @sku796
      @sku796 11 місяців тому

      @@BCEMCPATb Щоб так одразу доганяти, про що йде мова - з цим потрібно попрацювати і зрозуміти суть проблеми, побачити її. Щодо дженериків -- найяскравіштй приклад: спробуйте в одному класі оголосити 2 методи, які оверрайдять один одного. Один має роздруковувати список строк, інший - список людей: print(List ls){} print(List lp){}.