Я создаю игру, в которой объекты реализуют интерфейсы для анимации. У меня есть родительский интерфейс для анимации. Вот сокращенная версия:
public interface Animates<S extends Animator> {
S createAnimator(long animationTime);
}
Кроме того, у меня есть несколько интерфейсов, расширяющих этот интерфейс. Два примера:
public interface AnimatesPaint extends Animates<PaintAnimator> {
PaintAnimator createPaintAnimator(long animationTime);
default PaintAnimator createAnimator(long animationTime) {
return createPaintAnimator(animationTime);
}
}
и
public interface AnimatesPosition extends Animates<PositionAnimator> {
PositionAnimator createPositionAnimator(long animationTime);
@Override
default PositionAnimator createAnimator(long animationTime) {
return createPositionAnimator(animationTime);
}
}
Как видите, интерфейсы, расширяющие Animates
, переопределяют метод createAnimator
, чтобы делегировать логику createAnimator
к классу, который реализует интерфейс.
Причина, по которой я это делаю, заключается в том, что я хочу иметь элемент экрана (который может анимировать), который реализует несколько интерфейсов анимации (например, оба AnimatesPosition
для перемещения элемента и AnimatesPaint
изменить его цвет).
Однако это, по-видимому, не работает. Когда я реализую оба в одном классе (показано ниже), я получаю ошибку компиляции:
createAnimator (long) в AnimatesPaint конфликтует с createAnimator (long) в AnimatesPosition;попытка использовать несовместимые типы возврата
Вот пример класса, который реализует оба интерфейса Animates:
public class ScreenElement implements AnimatesPaint, AnimatesPosition {
@Override
PositionAnimator createPositionAnimator(long animationTime) {
return new PositionAnimator(animationTime);
}
@Override
PaintAnimator createPaintAnimator(long animationTime) {
return new PaintAnimator(animationTime);
}
}
Так что я не понимаю, что оба AnimatesPaint
и AnimatesPosition
уже реализует createAnimator
. Тем не менее, сообщение об ошибке указывает на то, что createAnimator
также необходимо реализовать с помощью ScreenElement
! Если бы createAnimator
еще не было бы реализовано, я бы понял, почему происходит конфликт.
Где моя логика идет не так?
В конце концов, чего я хочу достичь, должен иметь общий метод, который может инициировать любой тип анимации. Например:
public class AnimationStarter<S extends Animates, T> {
public void startAnimation(S animates, T start, T target, long animationTime) {
Animator animator = animates.createAnimator(animationTime);
animator.init(start, target);
animates.setAnimator(animator);
animator.startAnimation();
}
}
- Редактировать -
По запросу, вот объявление Аниматора
public abstract class Animator<T> {}
и один из его расширенных классов
public class PositionAnimator extends Animator<Point>{}