Я впервые использую Generics для школьного проекта, и я столкнулся с философской дилеммой относительно того, возвращать ли объекты или мой объявленный общий элемент в моих методах.Практические примеры Java - возврат объекта к общему
Мой OCD говорит мне, что мне нужно всегда возвращать известный тип, но я нахожу, что это создает некоторые неприятности, связанные с потоком, когда я кормя примитивные типы данных в свой класс (и, конечно же, для этого проекта я только когда-либо кормящие примитивы в этот класс).
Вот пример того, что я имею в виду:
public class DansPriorityQueue<E extends Comparable>
{
private ArrayList<E> tree;
//Here's a method that returns an object
public Object peek() {
return tree.get(0);
}
//Here's a method that returns the generic type
public E peek() {
return tree.get(0);
}
(В качестве FYI .. Я должен реализовать этот JDK класс сам, но я, к счастью, не требуется реализовать те же интерфейсы, что реальный PriorityQueue делает это у меня есть выбор, ли я хочу использовать объект или общий)
Мой выпуск
Это заставляет меня чувствовать себя аль ittle грязный, но я испытываю просто вернуть объект, а не мой E общего элемента на этих методов, потому что, когда я вернусь Е, JUnit силы, чтобы я бросил мои целые значения:
DansPriorityQueue<Integer> dpq = new DansPriorityQueue<Integer>();
dpq.add(1);
assertEquals("Expected different value", (Integer) 1, dpq.peek());
Когда я вернусь объект на с другой стороны, авто-бокс не заставляет меня отличать мое примитивное значение.
Вот более красноречив описание проблемы я столкнулась:
------------ EDIT --------- -------
Вот реальная ошибка, которую я получаю, когда возвращаю родовой тип и заполняю свой список автобоксированным объектом Integer без приведения выше: Метод assertEquals (String, Object, Object) неоднозначен для типа DansPriorityQueueTest
--------- END EDIT --------------
Вопросы
Может кто-нибудь сказать мне, почему я должен или не должен возвращать объект, а не общий элемент, с которым я работаю? У обоих, кажется, есть проблемы и недостатки ... Какая практика?
Я смутно знаю, что возвращение объекта может вызвать некоторые проблемы с кастомизацией позже, но я еще не столкнулся с ними ... есть ли у кого-нибудь конкретный пример того, как это может быть опасно?
В JDK я заметил, что многие из методов Collections возвращают Object по умолчанию. Это потому, что Generics была представлена в более поздней версии Java или это было сознательное решение Sun Systems?
Можете ли вы не просто параметризовать общий с помощью Integer, и все это работает на вас с помощью магии автобоксинга? – InfernalRapture
Что означает 'dpq.size()' как возвращаемый тип? Я немного смущен, потому что ваш пример использует вызов, который, кажется, не использует 'peek()' вообще, поэтому не уверен, что я понимаю релевантность. 'size()' не является методом, который был бы общим для типа элемента коллекции. –
Извините, что я отредактировал его с помощью метода peek выше ... Я схватил неправильный тест. – DanK