Java接口和类型多态,一个实现vs扩展

时间:2015-01-26 10:42:05

标签: java interface polymorphism abstract-class

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

所以我在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的人,但我在大学有一门课程,所以我记得很多东西,但细节可能很模糊,但这只是意味着在这种情况下实际的语法并不重要,因为它会有为了实例化而实现,依次扩展该类的任何东西都可以作为这个AudioManager中的参数?

2 个答案:

答案 0 :(得分:1)

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

extends<中使用>时,您指定了类型变量的边界。此处A<T extends B>表示T必须是B的子类型(不是子)。因此extends关键字可以具有不同的含义,具体取决于它发生的上下文。

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

答案 1 :(得分:0)

  

现在,如果我想使用此界面制作AudioManager,可以输入T&gt;扩展IAudioEntity。

不,您可以扩展类或实现接口。 IAudioEntity是接口,因此您需要实现它。

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

或者你可以做到这两点,但这大多没有意义。

请注意,自从java 8(有一天,它甚至可能来到Android;))之后,差异比以往更薄,因为接口可以通过使用defender方法来带来代码。