可能重复:
Why are these variables of an interface type not being used to instantiate new objects?
在我正在使用的API下面的代码示例中,有一个变量初始化,“audiodecoder”和“cc”。这两个变量属于接口类型。但是,除了actionlisteners之外,关键字 implements 不会在代码示例中的任何位置使用。
这与我迄今为止学到的关于Java的任何内容都不相符。我已经列出了下面的import语句,认为他们可能对IDecoder和ICodecContextWrapper没有相应的 implements 语句的原因有所了解。我也试图找到一些关于以这种方式使用接口的文档但没有成功。有人可以向我解释为什么不使用关键字 implements ?这个概念有没有名称,也许还有一些关于这个概念的文献?
编辑:我还应该补充说,变量未在示例代码中使用关键字 new 进行声明。
import org.libav.audio.Frame2AudioFrameAdapter;
import org.libav.audio.PlaybackMixer;
import org.libav.audio.SampleInputStream;
import org.libav.avcodec.ICodecContextWrapper;
import org.libav.avformat.IChapterWrapper;
import org.libav.avformat.IFormatContextWrapper;
import org.libav.avformat.IStreamWrapper;
import org.libav.avresample.bridge.AVResampleLibrary;
import org.libav.avutil.IDictionaryWrapper;
import org.libav.avutil.bridge.AVChannelLayout;
import org.libav.avutil.bridge.AVSampleFormat;
import org.libav.bridge.LibraryManager;
import org.libav.data.IFrameConsumer;
import org.libav.util.swing.VideoPane;
IDecoder audioDecoder = player.getAudioStreamDecoder(streamIndex);
ICodecContextWrapper cc = audioDecoder.getCodecContext();
答案 0 :(得分:13)
此
IDecoder audioDecoder = player.getAudioStreamDecoder(streamIndex);
表示返回的内容 implements IDecoder
。
e.g。
public IDecoder getAudioStreamDecoder() {
// constructs...
return new IDecoderImplementation();
}
请注意构造内容与返回引用之间的类型区别。
返回的对象将是一个具体的类,但由于它实现了该接口,因此该接口可以引用它。它可以实现其他接口,并且可以暴露功能,但您只能以IDecoder
答案 1 :(得分:1)
根据jlibav API documentation,有两个类是IDecoder
的具体实现:
AudioFrameDecoder
和VideoFrameDecoder
您的IDecoder
是这两个类之一的实例。 IDecoder
还扩展了另外两个接口:
IFrameProducer
和IPacketConsumer
ICodecContextWrapper
同样如此。有三个已知的类实现该接口:
AbstractCodecContextWrapper
,CodecContextWrapper53
和CodecContextWrapper54
您的ICodecContextWrapper
是这三个中的一个的实例。
这个概念叫做polymorphism。如果它令人困惑(而且很可能是初学者),你可能希望学习一些学习材料。