【问题标题】:Java interfaces and type polymorphism, one implement vs extendJava 接口和类型多态,一个实现 vs 扩展
【发布时间】:2015-01-26 10:42:04
【问题描述】:

所以我认为这更像是一个好奇的问题,而不是需要解决的问题。

所以我在 Android Studio 中使用 AndEngine for Android,我想创建一个 AudioManager 来处理我的所有音频,作为开始。

我可以实现 AndEngine 的称为 IAudioManager 的接口或扩展 BaseAudioManager,它已经是前面提到的接口的实现。这让我想到了我的问题。 IAudioManager 和 IAudioEntity:

public interface IAudioManager<T extends IAudioEntity> {

    public float getMasterVolume();
    public void setMasterVolume(final float pMasterVolume);

    public void add(final T pAudioEntity);
    public boolean remove(final T pAudioEntity);

    public void releaseAll();
}

public interface IAudioEntity {
    public void play();
    public void pause();
    public void resume();
    public void stop();

    public float getVolume();
    public void setVolume(final float pVolume);

    public float getLeftVolume();
    public float getRightVolume();
    public void setVolume(final float pLeftVolume, final float pRightVolume);

    public void onMasterVolumeChanged(final float pMasterVolume);

    public void setLooping(final boolean pLooping);

    public void release();
}

现在,如果我想使用此接口创建 AudioManager,可以将其键入为 T 扩展 IAudioEntity。但我认为你实现了接口而不是扩展它们,对吧?

所以我只是想知道在接口方面我是否遗漏了什么。我对 Java 不是很感兴趣,但我在 uni 有一门课程,所以我记得很多东西,但细节可能很模糊,但这是否意味着这种情况下的实际语法并不重要,因为它本来就有为了被实例化而被实现,并且任何扩展该类的东西都可以作为这个 AudioManager 中的参数?

【问题讨论】:

    标签: java interface polymorphism abstract-class


    【解决方案1】:

    它只是语法。在定义一个类时,您确实使用implements 表示该类实现了一个接口,并使用extends 表示该类是另一个类的子类。

    &lt;&gt; 中使用extends 时,您正在指定类型变量的边界。这里A&lt;T extends B&gt; 表示T 必须是B 的子类型(不是子)。因此,extends 关键字可能具有不同的含义,具体取决于它出现的上下文。

    这样做的原因是在不破坏代码的情况下向语言添加关键字并不容易。如果向语言添加新关键字(例如subtype),则将subtype 用作变量名的代码无法编译。因此,当 Java 1.5 中添加泛型时,他们选择重用关键字 extendssuper,而不是添加新关键字。

    【讨论】:

    • 我是这么想的,但想确认一下。我猜想解释它的 suptype 与子类的差异。还有更多你知道的。 :)
    【解决方案2】:

    现在,如果我想使用此接口创建一个 AudioManager,可以将其键入为 T > extends IAudioEntity。

    不,您可以扩展类或实现接口。 IAudioEntity 是一个接口,所以你需要实现它。

    或者你可以扩展 BaseAudioManager,这是一个类,实现 IAudioEntity。

    或者你可以两者都做,但这大多是没有意义的。

    请注意,从 java 8 开始(有一天,它甚至可能会出现在 Android 中;)),差异比以往任何时候都小,因为接口可以通过使用防御方法来带来代码。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-04-28
      • 2021-10-09
      • 2013-09-22
      • 2021-03-17
      • 1970-01-01
      • 2012-12-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多