четверг, 24 марта 2011 г.

Complex Generics

Недавно узнал решение для следующей задачи:
  1. Имеется класс С
  2. Имеется интерфейс I
  3. Нужно написать generic класс с параметром, который одновременно расширяет C и реализует I
Наивное решение:
class K<T extends C implements I>
приводит к очень невразумительным ошибкам компилятора: он не ругается на эту строку, но при этом считает, что K должен implements I.
А правильный вариант другой:
class K<T extends C & I>

Такой вот любопытный синтаксис. Это описано в разделе Converting Legacy Code to Use Generics. Там же указано, что интерфейсов можно задать сколько угодно:
class K<T extends C & I1 & I2 & ...>

Take Something Literally

Очень необычная головоломка:

С одной стороны - очень простая, а с другой - рехнуться можно!