为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕娘9325324 2023-10-13 16:40:49
我正在创建一个游戏,其中对象实现动画接口。我有一个动画的父界面。这是一个缩短的版本: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>{}
查看完整描述

2 回答

?
蝴蝶不菲

TA贡献1810条经验 获得超4个赞

所以我不明白的是两者AnimatesPaintAnimatesPosition已经实现了createAnimator

是的,这些实现相互冲突。如果您可以这样做,则生成的类的类型将需要公开两个createAnimator仅通过返回类型区分的方法。Java 不允许您拥有仅通过返回类型区分的重载,因此您不能这样做。出于重载目的,方法签名不包括返回类型。

即使它们具有相同的返回类型 ( Animator),您也会有两个具有完全相同签名的重载,但您不能这样做。

如果它们要在同一个类中实现,则它们需要是单独的方法(例如,具有可以区分的单独签名)。


在您提出的评论中:

但冲突不是因为该方法已经被AnimatesPaintand重写了AnimatesPosition吗?这样实现类ScreenElement不需要实现createAnimator方法,所以不会发生冲突。

不,因为类本身将这些方法公开(或者更确切地说,需要)作为其签名的一部分。基本上,假设您可以创建该类并且您有它的一个实例,s. 会做什么呢s.createAnimator(300L)?编译器应该选择哪一个?

类的公共类型由其所有公共成员组成,包括它实现的所有接口的所有公共成员。因此,在类型级别,两个接口不可能实现具有相同签名的方法。


查看完整回答
反对 回复 2023-10-13
?
Cats萌萌

TA贡献1805条经验 获得超9个赞

如果您调用 ScreenElements createAnimator() 方法,它应该使用哪一个?这就是编译器所抱怨的。您需要告诉它调用该方法时要做什么。根据代码我不确定。因此,您认为 ScreenElement 需要实现 create animator 方法是正确的,这样编译器就知道调用该方法时要做什么。



查看完整回答
反对 回复 2023-10-13
  • 2 回答
  • 0 关注
  • 55 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信