Я никогда не был уверен, нравится ли мне дженерики или нет. В этом случае кажется, что они были бы хорошей идеей и избавили бы вас от многих проблем. Поскольку постоянство (пока), кажется, не поддерживает их, я надену шляпу против обобщений и объясню, как выполняется real Java-программирование.
Тогда я бы хотел отказаться от обобщений и классов и просто вернуть старый набор:
public static Set getSetOfClass( Query q ) {
return new LinkedHashSet( q.getResultList() );
}
(используйте @SuppressWarnings ("unchecked") по мере необходимости, если вы не можете получить компилятор 1.4.)
Если запрос не содержит ничего, кроме E, у вас никогда не будет проблем. Или, во всяком случае, проблема будет редкой, очевидной во время выполнения и лучше всего решаемой программистами, которые неправильно используют ваш метод. Ничто не говорит «Измените свой базовый подход», как неожиданное исключение ClassCastException во время выполнения.
Если там есть случайные, законные объекты, не относящиеся к E-Fish, программисты, использующие этот метод, имеют больше возможностей для работы с ними, чем вы. Они могут проверить во время выполнения и при желании выбросить отдельную рыбу или бросить весь набор в соответствии с их назначением, которое они знают, а вы - нет.
Если вы действительно знаете их цели, то, возможно, вы можете избавить их от некоторых проблем, добавив параметр Clazz, чтобы вы знали, чего они хотят. Затем вы можете выполнить фильтрацию, либо вернуть нулевое значение, либо выдать собственное проверенное исключение, либо вернуть специальный объект класса, который подробно объясняет природу содержимого Set. Но убедитесь, что вы не выполняете больше работы, чем сохраняете пользователей метода.