为什么不能实现多个接口?

问题描述 投票:3回答:1

我正在创建一个对象在其中实现动画接口的游戏。我有一个动画的父界面。这是一个简化的版本:

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中与AnimatesPosition中的createAnimator(long);尝试使用返回类型不兼容

这是同时实现两个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);
    }
}

所以我不明白AnimatesPaintAnimatesPosition都已经实现了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();
    }
}

-Edit-]

根据要求,这是Animator的声明

public abstract class Animator<T> {}

及其扩展类之一

public class PositionAnimator extends Animator<Point>{}
java interface implements
1个回答
2
投票

所以我不明白AnimatesPaintAnimatesPosition都已经实现了createAnimator

© www.soinside.com 2019 - 2024. All rights reserved.