Это, вероятно, было задано раньше в той или иной форме, но я до сих пор не могу его решить, поэтому я подумал, что попрошу коллективную мудрость здесь. У меня такой интерфейс - я оставил некоторые комментарии, поскольку они могут помочь.Как избежать предупреждения об общем компиляторе для интерфейса
/** Technical note: this generic binding is known as F-bound where class
* T is 'the worked-on class' by Splittable i.e. the implementing class.
*/
interface Splittable <T extends Element & Splittable<T>> {
/** Returns an object of the same class which has been split off at
* the point given.
*/
public T splitOff(double at);
/** Appends the object provided, which must be of the same class, to
* this object.
*/
public void append(T el);
}
Итак, я работаю на элементе, который я не знаю, во время компиляции, таким образом:
if (el instanceof Splittable) {
if (nextEl.getClass == el.getClass) {
// same class so join them
((Splittable)el).append(nextEl);
}
}
и вот где я получаю предупреждение компилятора - бесконтрольно вызов для добавления (T) как член сырого типа Splittable.
В подклассе Element я попытался как
SubClassEl extends Element implements Splittable
и
SubClassEl extends Element implements Splittable<SubClassEl>
без разницы в предупреждении.
Кроме того, в момент вызова добавления(), я попытался
((Splittable)el).splitOff(x).append(nextElement)
но компилятор не распознает, что splitOff должен возвращать расщепляемое, только элемент.
Любые идеи?
Можете ли вы показать нам, что «Элемент» расширяет и реализует? – vikingsteve
Hi vikingsteve - не уверен, что это поможет: Элемент - это абстрактный класс, который я написал с помощью таких вещей, как getEditState, getHeight, которые, как я думаю, не имеют отношения к проблеме генериков. Спасибо за ваш интерес! –