gpt4 book ai didi

java - 为什么我不能实现多个接口(interface)?

转载 作者:行者123 更新时间:2023-12-04 14:53:39 25 4
gpt4 key购买 nike

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

public interface Animates<S extends Animator> {
S createAnimator(long animationTime);
}

另外,我有多个扩展这个接口(interface)的接口(interface)。两个例子:
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 的接口(interface)覆盖 createAnimator方法以委托(delegate) createAnimator 的逻辑到实现接口(interface)的类。

我这样做的原因是我希望能够拥有一个屏幕元素(可以动画),它实现了多个动画界面(例如 AnimatesPosition 来移动元素和 AnimatesPaint 来改变它的颜色)。

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

createAnimator(long) in AnimatesPaint clashes with createAnimator(long) in AnimatesPosition; attempting to use incompatible return types



下面是一个实现两个 Animates 接口(interface)的类的示例:
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();
}
}

--编辑--

根据要求,这里是 Animator 的声明
public abstract class Animator<T> {}

及其扩展类之一
public class PositionAnimator extends Animator<Point>{}

最佳答案

So what I don't understand is that both AnimatesPaint and AnimatesPosition already implement createAnimator.



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

即使它们具有相同的返回类型( Animator ),您也会有两个具有完全相同签名的重载,这是您无法做到的。

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

在您问过的评论中:

But isn't the conflict resolved by the fact that the method has already been overriden by AnimatesPaint and AnimatesPosition? This way the implementing class ScreenElement doesn't need to implement createAnimator method, so no conflict will occur.



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

一个类的公共(public)类型由它的所有公共(public)成员组成,包括它实现的所有接口(interface)的所有公共(public)成员。所以在类型级别上,两个接口(interface)不可能实现具有相同签名的方法。

关于java - 为什么我不能实现多个接口(interface)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58352983/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com