Какие хорошие ответы на вопросы и ответы на 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 - нет.

  1. Аннотация:

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

"В каких вещах хороши аннотации?" и "в каких вещах плохо звучат аннотации?" приходит на ум.

Аннотации хороши в метапрограммировании, но, как возможная передовая практика, код, который работал с аннотациями, должен по-прежнему работать, если вы вынимаете все из них.

Или нет. Ваш пробег может отличаться, но вы, вероятно, хотите, чтобы все ваши старшие разработчики согласились на это.