Class Enum >
? Список расширяет T> x ()
полезной сигнатурой? Сложнее:
Q: В чем разница между Hashmap и Hashtable?
A: Hashtable синхронизируется, Hashmap - нет.
Q: Опишите сериализацию java-объектов с помощью интерфейса и аннотаций javax.xml.bind.Marshaller.
A: Описание чего-то подобного в осмысленном контексте должно быть приемлемым:
@XmlRootElement
класс Сотрудник {
...
}
Аннотации: Какие риски? (компилятор может попасть в бесконечный цикл и заглушить процесс сборки).
Дженерики: Как создать миксин с использованием дженериков? (напишите общий класс, который принимает параметр, а затем расширьте его подклассом в качестве параметра).
Также +1 за стирание шрифта.
Общие: Задайте вопрос, чтобы узнать, понимают ли они стирание типа .
Аннотации: спросите их, какая аннотация нравится им больше всего и как она работает (вам не нужны подробные технические объяснения, но вы ищете нечто большее, чем «волшебство»).
Вопрос: Как можно определить тип объекта, который использует generic во время выполнения?
Ответ: Невозможно определить тип из-за стирания типов.
Вот некоторые из них, которые я только что придумал:
- [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<?>();
- Только [Ограничения] Животные
должны помещаться в Клетки
. Как мы можем ужесточить определения классов выше, чтобы они отражали это новое требование?
- [Юридические проблемы] Вы не можете создать экземпляр массива универсального типа. Таким образом, что-то вроде new List
недопустимо.Можете ли вы представить сценарий, при котором, если бы это было законным, у вас были бы проблемы?
Ответы, оставленные читателю в качестве упражнения - вы ничего не узнаете, если не сделаете это? не разбирайся в них сам! Но вот несколько подсказок.
?
? Вы помните термин «ковариация»? Object [] arr = new List []
. Можете ли вы написать код, который помещает что-то в списки
arr
, которые не должны туда входить? Вот пара обобщений:
1)
Вопрос : Если бы у меня был этот метод, как бы я создал новый экземпляр типа T
и назначьте его переменной с именем item
внутри этого метода (предположим, что Class
имеет конструктор по умолчанию)?
public static <T> Collection<T> select(Class<T> c, String sqlStatement) {
}
Ответ :
T item = c.newInstance();
2)
Вопрос : Если вы хотите указать, что универсальный расширяет некоторый базовый класс, но вы не знаете, каким будет класс, расширяющий базовый класс, до времени выполнения, как вы могли бы объявить универсальный?
Ответ : используйте подстановочный знак: расширяет SomeBaseClass>
С момента выхода Java 5 я видел десятки людей, не понимающих, почему, учитывая интерфейс I
и классы A
и B расширяет A
, вы не можете передать I
, где требуется I
. Многие люди находят это нелогичным.
Чтобы проверить способность человека рассуждать о дженериках, я бы сначала спросил их, возможно ли присвоить I
объекту I
ссылка, как описано выше. Если нет, то почему? Если они ошибаются, скажите им, что они ошибаются, и попросите их попробовать заполнить пробелы здесь, чтобы показать, почему этот пример был бы небезопасным по типу, если бы он мог компилироваться:
//...
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));
Если вы ищете рок-звезду Java-программиста, вы могли бы составить довольно много продвинутых вопросов из главы Generics в книге Bloch's Effective Java. Такие вещи, как однородные или неоднородные контейнеры (примеры с клеткой для птиц и клеткой для льва из одного из учебников по java), стирание и т.д.
У менее опытных людей я прежде всего ищу понимание того, зачем нужны дженерики (вы удивитесь, как много людей не понимают этого и считают, что способ Java 2 все еще правит), и тому подобные вещи.
В аннотациях мне нравится спрашивать об аннотации "Override" и ее преимуществах. Мне также нравится проводить более глубокое обсуждение плюсов и минусов аннотаций и того, когда их уместно использовать - я не поклонник слишком усердного мета-программирования. Это также хороший шанс увидеть, использовал ли кто-то Hibernate или JUnit с аннотациями.
"Какие вещи лучше всего подходят для аннотаций?" и "в чем плохие аннотации?" приходит на ум.
Аннотации хороши для метапрограммирования, но в качестве возможной передовой практики код, который работал с аннотациями, все равно должен работать, если вы уберете их все.
Или нет. Ваш опыт может отличаться, но вы, вероятно, хотите, чтобы все ваши старшие разработчики согласились с этим.