Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我无法理解java中泛型中传递接口的用法_Java - Fatal编程技术网

我无法理解java中泛型中传递接口的用法

我无法理解java中泛型中传递接口的用法,java,Java,我在coursera上设计模式课程,我被指派通过观察uml图来实现空代码块。给定的uml图如下所示 这是给定的空代码块 下面是Program.java源代码 公共类程序{ 公共静态void main(字符串参数[]){ //创建新的空“学习”播放列表 播放列表研究播放列表=新播放列表(“研究”); //制作“Synth Pop”播放列表并添加2首歌曲。 播放列表SynthPopLaylist=新播放列表(“SynthPop”); Song synthPopSong1=新歌(“像你一样的女孩”,

我在coursera上设计模式课程,我被指派通过观察uml图来实现空代码块。给定的uml图如下所示

这是给定的空代码块

下面是
Program.java
源代码

公共类程序{
公共静态void main(字符串参数[]){
//创建新的空“学习”播放列表
播放列表研究播放列表=新播放列表(“研究”);
//制作“Synth Pop”播放列表并添加2首歌曲。
播放列表SynthPopLaylist=新播放列表(“SynthPop”);
Song synthPopSong1=新歌(“像你一样的女孩”,“Toro Y Moi”);
Song synthPopSong2=新歌(“外部”、“顶部”);
synthPopLaylist.add(synthPopSong1);
synthPopLaylist.add(synthPopSong2);
//制作“实验”播放列表并添加3首歌曲,
//然后将播放列表的播放速度设置为0.5倍
播放列表实验播放列表=新播放列表(“实验”);
歌曲实验歌曲1=新歌(“关于你”,“XXYYXX”);
歌曲实验歌曲2=新歌(“动机”,“蛤蜊赌场”);
Song experimentalSong3=新歌(“计算机视觉”,“Oneohtrix Point Never”);
experimentalPlaylist.add(experimentalSong1);
experimentalPlaylist.add(experimentalSong2);
experimentalPlaylist.add(experimentalSong3);
浮子慢速=0.5f;
设置播放速度(慢速度);
//将“Synth Pop”播放列表添加到“实验”播放列表中
添加(synthPopPlaylist);
//将“实验”播放列表添加到“研究”播放列表中
添加(实验播放列表);
//创建一首新歌并将其播放速度设置为1.25倍,播放这首歌,
//获取glitchSong的名称→ “Textuell”,然后找到这首歌的作者→ “椭圆形”
Song glitchSong=新歌(“Textuell”、“Oval”);
浮子紧固件速度=1.25f;
设置播放速度(快速速度);
glitchSong.play();
String name=glitchSong.getName();
String-artist=glitchSong.getArtist();
System.out.println(“歌曲名称为”+名称);
System.out.println(“歌曲艺术家是”+艺术家);
//将glitchSong添加到“学习”播放列表中
studyPlaylist.add(glitchSong);
//播放“学习”播放列表。
studyPlaylist.play();
//获取studyPlaylist的播放列表名称→ “研究”
System.out.println(“播放列表的名称为”+studyPlaylist.getName());
}
}
--------------------
[IComponent.java]
--------------------
公共接口IComponent{
//你的密码在这里!
}
--------------------
[Playlist.java]
--------------------
公共类播放列表实现IComponent{
公共字符串名称;
public ArrayList playlist=新建ArrayList();
公共播放列表(字符串播放名){
this.playliName=播放名;
}
//你的密码在这里!
}
--------------------
[Song.java]
--------------------
公共类Song实现了IComponent{
公共字符串词名;
公共弦乐艺术家;
公共浮点速度=1;//默认播放速度
公共歌曲(弦乐歌曲名、弦乐艺术家){
this.songName=songName;
这个艺术家=艺术家;
}
//你的密码在这里!
}

在这段代码中,IComponent是接口,它在Arraylist泛型中传递,我无法理解这段代码的含义;在一个容器中有一个对象列表(本例中为列表),所有这些对象都实现了相同的接口,这意味着您可以调用接口方法,而不必知道或关心它们是什么类型的对象

通用组件列表意味着列表中的所有对象都符合
IComponent
界面。由于
Song
Playlist
都实现了
IComponent
,因此列表可以包含这两种类型的对象

这并不意味着什么,因为在
IComponent
中没有声明任何方法。例如,在
IComponent
中声明
play()
方法后,编译器将确保
Song
Playlist
类实现
play()
。这意味着当您获得对列表中任何对象的引用时,您可以调用
IComponent::play
方法,而不管它是什么类型的对象。如果对象是
歌曲
,则调用
歌曲::播放
方法。如果是
Playlist
,则调用
Playlist::play
方法

歌曲::播放
当然应该播放歌曲


Playlist::play
方法应在存储在
Playlist
中的列表中的每个
i组件上调用
play()
。因此,一个
播放列表
可能包含另一个
播放列表
或歌曲和播放列表的任意组合。

当您的问题涉及许多概念(接口、复合模式)时,您的直接问题是关于在声明中将接口用作泛型类型的特定类型

以代码为例:

List<IComponent> playlist = new ArrayList<>();
List playlist=new ArrayList();
这是将变量
playlist
声明为IComponents列表。换句话说,该列表包含实现
IComponent
的类的实例。在您的情况下,这意味着
播放列表
可以包含
歌曲
播放列表
类的任何实例。但是,它并不限于这些类:您可以定义其他类(例如,
VoiceMessage
),这些类也可以实现
IComponent

通过将列表声明为包含
IComponent
的实例,您希望将对列表项调用的方法限制为在该接口中声明的方法(尽管Java支持强制转换以避免该限制)。

Basic