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

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


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更改其颜色)。


然而,这显然行不通。当我在一个类中实现两者时(如下所示),我收到编译错误:


AnimatesPaint 中的 createAnimator(long) 与 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);

    }

}

所以我不明白的是两者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();

    }

}

- 编辑 -


根据要求,这里是 Animator 的声明


public abstract class Animator<T> {}

及其扩展类之一


public class PositionAnimator extends Animator<Point>{}


慕娘9325324
浏览 99回答 2
2回答

蝴蝶不菲

所以我不明白的是两者AnimatesPaint都AnimatesPosition已经实现了createAnimator。是的,这些实现相互冲突。如果您可以这样做,则生成的类的类型将需要公开两个createAnimator仅通过返回类型区分的方法。Java 不允许您拥有仅通过返回类型区分的重载,因此您不能这样做。出于重载目的,方法签名不包括返回类型。即使它们具有相同的返回类型 ( Animator),您也会有两个具有完全相同签名的重载,但您不能这样做。如果它们要在同一个类中实现,则它们需要是单独的方法(例如,具有可以区分的单独签名)。在您提出的评论中:但冲突不是因为该方法已经被AnimatesPaintand重写了AnimatesPosition吗?这样实现类ScreenElement不需要实现createAnimator方法,所以不会发生冲突。不,因为类本身将这些方法公开(或者更确切地说,需要)作为其签名的一部分。基本上,假设您可以创建该类并且您有它的一个实例,s. 会做什么呢s.createAnimator(300L)?编译器应该选择哪一个?类的公共类型由其所有公共成员组成,包括它实现的所有接口的所有公共成员。因此,在类型级别,两个接口不可能实现具有相同签名的方法。

Cats萌萌

如果您调用 ScreenElements createAnimator() 方法,它应该使用哪一个?这就是编译器所抱怨的。您需要告诉它调用该方法时要做什么。根据代码我不确定。因此,您认为 ScreenElement 需要实现 create animator 方法是正确的,这样编译器就知道调用该方法时要做什么。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java