所以这更像是一个好奇的问题,而不是需要解决问题,我想。
所以我在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中的参数?
答案 0 :(得分:1)
它的语法。在定义类时,确实使用implements
来表示该类实现了接口,并使用extends
来指示该类是另一个类的子类。
在extends
和<
中使用>
时,您指定了类型变量的边界。此处A<T extends B>
表示T
必须是B
的子类型(不是子类)。因此extends
关键字可以具有不同的含义,具体取决于它发生的上下文。
原因是在不破坏代码的情况下向语言添加关键字并不容易。如果向该语言添加新关键字(例如subtype
),则subtype
用作变量名的代码将无法编译。因此,当在Java 1.5中添加泛型时,他们选择重复使用关键字extends
和super
,而不是添加新关键字。
答案 1 :(得分:0)
现在,如果我想使用此界面制作AudioManager,可以输入T&gt;扩展IAudioEntity。
不,您可以扩展类或实现接口。 IAudioEntity是接口,因此您需要实现它。
或者你可以扩展 BaseAudioManager,它是一个类实现 IAudioEntity。
或者你可以做到这两点,但这大多没有意义。
请注意,自从java 8(有一天,它甚至可能来到Android;))之后,差异比以往更薄,因为接口可以通过使用defender方法来带来代码。