在泛型中传递Interface会做什么?


public interface IComponent {
public void play();
public void setPlaybackSpeed();
public String getName();

}
public class Playlist implements IComponent {
public String playlistName;
public ArrayList<IComponent> playlist = new ArrayList();
public Playlist(String playlistName) {
this.playlistName = playlistName;
}

public void play(){
System.out.println("Playing the song");
}
public void setPlaybackSpeed(){
System.out.println("Setting the speed of playback to the specified value");
}
public String getName(){
return this.playlistName;
}

public void add(IComponent component){
}
public void remove(IComponent component){
}
}

i am able to understand in the line

public ArrayList<IComponent> playlist = new ArrayList();

当我们在泛型中传递任何类时,它只允许传递该类型数据的对象。当我们传递interface时会发生什么,代码会发生什么。

必须传递一个实例来实现接口中调用的方法。

这就是接口和泛型的美妙之处:您可以通过更改实现类来以良好定义的方式更改行为。

我想说你的类命名有很多需要改进的地方。我会选择Song/IComponent。后者对我的口味来说太普通了。

您没有显示IComponent接口,但如果它包含play方法对我来说是有意义的。这种设计允许用户播放单个歌曲或整个播放列表。它被称为复合模式。

你的方法还有很多工作要做。您应该能够轻松地实现play,addremove

实际上是将功能和属性混合在一起。这里的播放列表实际上是一个容器,它应该包含可播放的项目,而不是播放它们的能力。

创建播放列表泛型:

public T class Playlist<T> {
public String playlistName;
public ArrayList<T> playlist = new ArrayList();

... // SOME METHODS
}

IComponent类的实际实现:

public class IComponentImpl implements IComponent {
public void play(){
System.out.println("Playing the song");
}
public void setPlaybackSpeed(){
System.out.println("Setting the speed of playback to the specified value");
}
...// other methods related to playable objects.
}

现在你可以使用

IComponent song1 = new IComponentImpl();
IComponent song2 = new IComponentImpl();
PlayList<IComponent> playlist = new PlayList<>();
playlist.add(song1);
playlist.add(song2);
// which return a song
playlist.get(at_position).play();

这样就可以同时使用泛型和接口了。

最新更新