Какие хорошие ответы на вопросы о java-интервью и ответы в отношении дженериков и аннотаций?
Какие хорошие ответы на вопросы и ответы на java о дженериках и аннотациях?
Ответ 1
Так как Java 5 вышел, я видел, что десятки людей не понимают, почему, учитывая интерфейс I
и классы A
и B extends A
, вы не можете передать I<B>
, где I<A>
обязательный. Многие люди находят это противоречивым.
Чтобы проверить способность человека рассуждать о Generics, я сначала спрошу их, возможно ли присвоить I<B>
ссылку I<A>
, как описано выше. Если нет, почему бы и нет? Если они ошибаются, скажите им, что они неправы, и попросите их попробовать заполнить пробелы здесь, чтобы показать, почему этот пример будет небезопасным, если он может скомпилировать:
//...
List<String> list = new LinkedList<String>();
someMethod(list);
//blank 1
}
public void someMethod(List<Object> list) {
//blank 2
}
На данный момент это должно быть довольно легко, и я был бы немного обеспокоен, если бы они не смогли построить такой пример. Пример:
//blank 1
String item = list.get(0);
//blank 2
list.add(Integer.valueOf(5));
Ответ 2
Этот тест:
http://tests4geeks.com/test/java
содержит некоторые вопросы об аннотации.
В нем нет никаких вопросов об общем. Но вместо этого есть и другие интересные темы, например:
Многопоточность,
Память,
Алгоритмы и структуры данных,
ООП,
и др.
Ответ 3
- Что обеспечивает
Class Enum<E extends Enum<E>>
? - Является ли
<T> List<? extends T> x()
полезной сигнатурой? - Политика сохранения аннотаций и почему они на месте?
- Предположим, вы хотели бы повторно использовать класс в разных контекстах, используя аннотации или внешнюю конфигурацию? (т.е. аннотация вводит зависимости).
Harder:
- Примеры допустимого общего типа, который не может быть выражен системой Java-типа и приведет к предупреждениям компилятора.
- Примеры, когда компилятор java будет/не будет вызывать общий тип? (примеры кода, в которых компилятор будет выводить неверный тип)
- Какая информация общего типа не удаляется и может быть получена из байтового кода? (Super type tokes - это одно приложение)
- Какой APT (использовать случаи, когда не использовать отражение)?
Ответ 4
Вопрос: Как вы можете определить, какой тип объекта используется универсальным во время выполнения?
Ответ: Невозможно определить тип из-за стирания стилей.
Ответ 5
- Общий:
Q: В чем разница между Hashmap и Hashtable?
A: Hashtable синхронизирована, Hashmap - нет.
- Аннотация:
Q: Описать сериализацию java-объектов с помощью интерфейса javax.xml.bind.Marshaller и аннотаций.
A: Описывать что-то подобное в содержательном контексте должно быть приемлемым:
@XmlRootElement
class Employee {
...
}
Ответ 6
Generics: задайте вопрос, чтобы понять, понимают ли они тип стирания.
Аннотации: спросите их, что их любимая аннотация, и как она работает (вам не нужно подробное техническое объяснение, но вы ищете нечто большее, чем "магия" ).
Ответ 7
Аннотации: каковы риски? (компилятор может попасть в бесконечный цикл и затормозить процесс сборки).
Generics: Как создать mixin с использованием дженериков? (напишите общий класс, который принимает параметр, а затем расширьте его подклассом в качестве параметра).
Кроме того, +1 на стирание типа.
Ответ 8
Вот пара дженериков:
1)
Вопрос. Если бы у меня был этот метод, как бы создать новый экземпляр типа T
и назначить его переменной с именем item
внутри этого метода (предположим, что Class<T>
имеет конструктор по умолчанию)?
public static <T> Collection<T> select(Class<T> c, String sqlStatement) {
}
Ответ
T item = c.newInstance();
2)
Вопрос. Если вы хотите указать, что общий расширяет базовый класс, но вы не знаете, какой класс, который расширяет базовый класс, будет до выполнения, как вы могли бы объявить общий?
Ответ: используйте подстановочный знак: <? extends SomeBaseClass>
Ответ 9
Если вы ищете Java-программиста из рок-звезды, вы можете создать довольно много продвинутых вопросов из глава Generics в блоховской эффективной Java, Такие вещи, как гомогенные или гетерогенные контейнеры (примеры клетка для птиц и львов из одного из учебников по java), стирание и т.д.
В менее старших людях я в первую очередь ищут понимание того, почему нужно было бы использовать дженерики (вы были бы удивлены, как многие люди этого не понимают, и считают, что Java-2 делает все еще правила), и тому подобное.
В аннотациях мне нравится спрашивать об аннотации "Override" и ее преимуществах. Мне также нравится иметь более глубокое обсуждение плюсов и минусов аннотаций и, когда это целесообразно использовать, я не поклонник чрезмерного метапрограмм. Это также хороший шанс увидеть, кто-то использовал Hibernate или JUnit с аннотациями.
Ответ 10
Вот несколько, которые я только что составил:
- [Cagey generics] Может ли раскол любой из этих строк вызвать проблемы? Какие из них, если они есть? Почему или почему нет?
public class Cage<T> { ... }
public class Animal { ... }
public class Bear extends Animal { ... }
// Cage<Animal> c = new Cage<Bear>();
// Cage<Bear> c = new Cage<Animal>();
// Cage<?> c = new Cage<Animal>();
// Cage<Animal> c = new Cage<?>();
- [Ограничения] Только Animals
должен перейти в Cages
. Как мы можем ужесточить определения классов выше, чтобы они отразили это новое требование?
- [Юридические проблемы] Вы не можете создать экземпляр массива общего типа. Таким образом, что-то вроде new List<Animal>[10]
является незаконным. Можете ли вы представить себе сценарий, в котором, если бы это было законно, вы столкнулись бы с бедой?
Ответы как упражнение для читателя - вы ничего не узнаете, если не осознаете самих себя! Но вот несколько советов.
- [Cagey generics]: Что означает
?
? Вы помните термин "ковариация"? - [Ограничения]: Java позволяет ограничить значения параметра типа. Вы помните синтаксис этого?
- [Правовые проблемы]: предположим, что вы могли бы сделать
Object[] arr = new List<String>[]
. Можете ли вы написать код, который помещает что-то вarr
Lists
, который не должен туда заходить?
Ответ 11
"В каких вещах хороши аннотации?" и "в каких вещах плохо звучат аннотации?" приходит на ум.
Аннотации хороши в метапрограммировании, но, как возможная передовая практика, код, который работал с аннотациями, должен по-прежнему работать, если вы вынимаете все из них.
Или нет. Ваш пробег может отличаться, но вы, вероятно, хотите, чтобы все ваши старшие разработчики согласились на это.