Какие системы контроля версий вы знаете?
Git, SVN, Bazaar, Mercurial
Чем отличаются SVN и Git?
GIT — распределенная СКВ, а SVN — нет. Другими словами, если есть несколько разработчиков работающих с репозиторием у каждого на локальной машине будет ПОЛНАЯ копия этого репозитория. Разумеется есть и центральная машина, с которой можно клонировать репозиторий. Это напоминает SVN. Основной плюс Git в том, что если вдруг у вас нет доступа к интернету, сохраняется возможность работать с репозиторием. Потом только один раз сделать синхронизацию и все остальные разработчики получат полную историю.
GIT сохраняет метаданные изменений, а SVN целые файлы. Это экономит место и время.
Что такое GitHub? У вас есть проекты на GitHub?
GitHub — веб-сервис хостинга проектов с использованием системы контроля версий git, а также как социальная сеть для разработчиков. Пользователи могут создавать неограниченное число репозиториев, для каждого из которых предоставляется wiki, система issue tracking-а, есть возможность проводить code review и т.п. Кроме Git, сервис поддерживает получение и редактирование кода через SVN и Mercurial.
Зачем нужны системы контроля версий?
СКВ дает возможность возвращать отдельные файлы к прежнему виду, возвращать к прежнему состоянию весь проект, просматривать происходящие со временем изменения, определять, кто последним вносил изменения во внезапно переставший работать модуль, кто и когда внес в код какую-то ошибку, и т.п.. Вообще, если, пользуясь СКВ, вы всё испортите или потеряете файлы, всё можно будет легко восстановить.
Что такое generic? Как они реализованы в Java?
Generics — это параметризованные типы. С их помощью можно объявлять классы, интерфейсы и методы, где тип данных указан в виде параметра. Обобщения добавили в язык безопасность типов.
Пример реализации:
class MyClass<T>{ T obj; public MyClass(T obj){ this.obj = obj; } } class MyClass<T>В угловых скобках используется T — имя параметра типа. Это имя используется в качестве заполнителя, куда будет подставлено имя реального типа, переданного классу
MyClassпри создании реальных типов. То есть параметр типаTприменяется в классе всякий раз, когда требуется параметр типа. Угловые скобки указывают, что параметр может быть обобщен. Сам класс при этом называется обобщенным классом или параметризованным типом.Далее тип
Tиспользуется для объявления объекта по имениobj:T obj;Вместо
Tподставится реальный тип, который будет указан при создании объекта классаMyClass. Объектobjбудет объектом типа, переданного в параметре типаT. Если в параметреTпередать типString, то экземплярobjбудет иметь типString.Рассмотрим конструктор
MyClass():public MyClass(T obj){ this.obj = obj; }Параметр
objимеет типT. Это значит, что реальный тип параметраobjопределяется типом, переданным параметром типаTпри создании объекта классаMyClass.Параметр типа
Tтакже может быть использован для указания типа возвращаемого значения метода.В именах переменных типа принято использовать заглавные буквы. Обычно для коллекций используется буква
E, буквамиKиV— типы ключей и значение (Key/Value), а буквойT(и при необходимости буквыSиU) — любой тип.Обобщения работают только с объектами. Поэтому нельзя использовать в качестве параметра элементарные типы вроде
intилиchar.*Так же считаю нужным упомянуть generic методы. Это методы вида:
модификаторы <T, ...> возвращаемыйТип имяМетода(T t, ...)
Как я понял, если в качестве типа в сигнатуре метода используются параметры, необходимо перед типом возвращаемого значения их перечислить. Верно ли это?
Более подробную информацию можно посмотреть по следующим ссылкам:
Что такое стирание типов?
Внутри класса-дженерика не хранится информация о его типе параметре. Это и называется стиранием типов. На стадии компиляции происходит приведение объекта класса к типу, который был указан при объявлении.
Пример:
Что такое wildcard?
Wildcard — это дженерик вида <?>, что означает, что тип может быть чем угодно. Используется, например, в коллекциях, где для всех коллекций базовым типом является Сollection<?>.
Полезная ссылка: Теория и практика Java. Эксперименты с generic-методами
Расскажите про extends и super в Generic'ах?
Чтобы наложить ограничение на wildcard необходимо использовать конструкции типа:
? extends SomeClass— означает, что может быть использован любой класс-наследник SomeClass? super SomeClass— означает, что может быть использован класс SomeClass, либо класс-родитель (или интерфейс) SomeClass
Это называется bounded wildcard.
Для того, чтобы определиться с выбором между
extendsиsuperбыл придуман метод PECS.Подробно про это можно прочитать по ссылке ниже: Использование generic wildcards для повышения удобства Java API
Как использовать wildcard?
Пример использования wildcard:
List<?> numList = new ArrayList<Integer>();Вопрос я не понял, но в принципе использование wildcard’ов рассматривается в материалах по ссылкам выше.
В чем отличие ArrayList и ArrayList<?>
Запись вида ArrayList называется raw type (обычный тип). Она эквивалентна записи вида ArrayList<T> и используется для обратной совместимости, т.к. до Java 1.5 не было дженерик коллекций. По возможности такой формы записи следует избегать.
ArrayList<?> является супертипом для ArrayList.
Зепп Бранниган
80 уровень
Уровень 35. Ответы на вопросы к собеседованию по теме уровня
Вопросы/дополнения/критика приветствуются.
![Уровень 35. Ответы на вопросы к собеседованию по теме уровня - 1]()
Комментарии (4)
- популярные
- новые
- старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Ольга Николенко
20 декабря 2023, 21:10
По 10-му вопросу понимания нет, единственное что предполагаю - использование wildcard позволит ловить ошибки на этапе компиляции, в то время как raw type пропустит практически все и ошибка будет поймана в runtime.
Если кто поделится грамотным ответом на 10й вопрос буду очень благодарна.
0
Андрей ШевченкоJunior Java Developer в CUSTIS
30 ноября 2020, 20:38
Про 10 вопрос не до конца понял, может кто пояснить, зачем wildcard <?> вообще нужен.
Прочел https://docs.oracle.com/javase/tutorial/java/generics/unboundedWildcards.html
и все равно не вижу смысла в этом <?>, т.к. в примерах по ссылке все бы работало и с raw types
+4
ДаниилSalesforce Developer в CustomertimesMaster
10 сентября 2019, 07:41
Несоответсвие в вопросе 2.2. Согласно вики:
Модель работы
Subversion — централизованная система (в отличие от распределённых систем, таких как Git или Mercurial), то есть данные хранятся в едином хранилище. Хранилище может располагаться на локальном диске или на сетевом сервере.
Работа в Subversion мало отличается от работы в других централизованных системах управления версиями. Клиенты копируют файлы из хранилища, создавая локальные рабочие копии, затем вносят изменения в рабочие копии и фиксируют эти изменения в хранилище. Несколько клиентов могут одновременно обращаться к хранилищу. Для совместной работы над файлами в Subversion преимущественно используется модель копирование — изменение — слияние. Кроме того, для файлов, не допускающих слияние (различные бинарные форматы файлов), можно использовать модель блокирование — изменение — разблокирование.
При сохранении новых версий используется дельта-компрессия: система находит отличия новой версии от предыдущей и записывает только их, избегая дублирования данных.
При использовании доступа с помощью WebDAV также поддерживается прозрачное управление версиями — если любой клиент WebDAV открывает для записи и затем сохраняет файл, хранящийся на сетевом ресурсе, то автоматически создаётся новая версия.
+2
Ярослав Java Developer Master
4 июля 2018, 18:37
ArrayList list === ArrayList<Object> list; // То есть, туда можно положить вообще всё.
ArrayList<?> list === ArrayList<? extends Object> list; // Сюда вообще ничего нельзя положить.
Почему нельзя положить: у нас будет коллекция, тип которой может быть любым типом от Object. А это значит, что там может быть и коллекция String, и коллекция Number, и в такой анархии просто ничего нельзя положить, ибо мы можем положить String, а коллекция будет Number'ов.
Чтобы можно было положить, нужно использовать ? super Object, которая по действию будет эквивалентна просто сырому типу. Так как у нас коллекция будет этого же типа, который мы указали, или же типа родителя, то нам точно известно, что мы можем добавлять в коллекцию Object.
Более нормальным пример: ? super String. У нас коллекция может быть только List<Object> или List<String>. В любом случае, мы можем добавлять туда String.
Достаточно запомнить правило PECS: Producer - extends, Consumer - super.
+20