Afli
41 уровень
Санкт-Петербург

Уровень 35. Ответы на вопросы к собеседованию по теме уровня.

Пост из группы Архив info.javarush.ru
2599 участников
Вопросы/дополнения/критика приветствуются. Какие системы контроля версий вы знаете? Git, SVN, Bazaar, Mercurial Чем отличаются SVN и Git?
  1. GIT - распределенная СКВ, а SVN - нет. Другими словами, если есть несколько разработчиков работающих с репозиторием у каждого на локальной машине будет ПОЛНАЯ копия этого репозитория. Разумеется есть и центральная машина, с которой можно клонировать репозиторий. Это напоминает SVN. Основной плюс Git в том, что если вдруг у вас нет доступа к интернету, сохраняется возможность работать с репозиторием. Потом только один раз сделать синхронизацию и все остальные разработчики получат полную историю.
  2. GIT сохраняет метаданные изменений, а SVN целые файлы. Это экономит место и время.
Что такое GitHub? У вас есть проекты на GitHub? GitHub - веб-сервис хостинга проектов с использованием системы контроля версий git, а также как социальная сеть для разработчиков. Пользователи могут создавать неограниченное число репозиториев, для каждого из которых предоставляется wiki, система issue tracking-а, есть возможность проводить code review и т.п. Кроме Git, сервис поддерживает получение и редактирование кода через SVN и Mercurial. Зачем нужны системы контроля версий? СКВ дает возможность возвращать отдельные файлы к прежнему виду, возвращать к прежнему состоянию весь проект, просматривать происходящие со временем изменения, определять, кто последним вносил изменения во внезапно переставший работать модуль, кто и когда внес в код какую-то ошибку, и т.п.. Вообще, если, пользуясь СКВ, вы всё испортите или потеряете файлы, всё можно будет легко восстановить. Что такое generic? Как они реализованы в Java? Generics - это параметризованные типы. С их помощью можно объявлять классы, интерфейсы и методы, где тип данных указан в виде параметра. Обобщения добавили в язык безопасность типов. Пример реализации: class MyClass{ T obj; public MyClass(T obj){ this.obj = obj; } } class MyClass В угловых скобках используется 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, ...) Как я понял, если в качестве типа в сигнатуре метода используются параметры, необходимо перед типом возвращаемого значения их перечислить. Верно ли это? Более подробную информацию можно посмотреть по следующим ссылкам: http://developer.alexanderklimov.ru/android/java/generic.php http://www.quizful.net/post/java-generics-tutorial Что такое стирание типов? Внутри класса-дженерика не хранится информация о его типе параметре. Это и называется стиранием типов. На стадии компиляции происходит приведение объекта класса к типу. который был указан при объявлении. Пример: Что такое wildcard? Wildcard - это дженерик вида , что означает, что тип может быть чем угодно. Используется, например, в коллекциях, где для всех коллекций базовым типом является Сollection. Полезная ссылка: http://www.k-press.ru/cs/2008/3/generic/generic.asp Расскажите про extends и super в Generic'ах? Чтобы наложить ограничение на wildcard необходимо использовать конструкции типа: ? extends SomeClass - означает, что может быть использован любой класс-наследник SomeClass ? super SomeClass - означает, что может быть использован класс SomeClass, либо класс-родитель (или интерфейс) SomeClass Это называется bounded wildcard. Для того, чтобы определиться с выбором между extends и super был придуман метод PECS. Подробно про это можно прочитать по ссылке ниже: https://habrahabr.ru/post/207360/ Как использовать wildcard? Пример использования wildcard: List numList = new ArrayList(); Вопрос я не понял, но в принципе использование wildcard’ов рассматривается в материалах по ссылкам выше. В чем отличие ArrayList и ArrayList Запись вида ArrayList называется raw type (обычный тип). Она эквивалентна записи вида ArrayList и используется для обратной совместимости, т.к. до Java 1.5 не было дженерик коллекций. По возможности такой формы записи следует избегать. ArrayList является супертипом для ArrayList.