如何在没有关键字“implements”的情况下使用接口?

时间:2013-01-03 16:33:44

标签: java

  

可能重复:
  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();

2 个答案:

答案 0 :(得分:13)

IDecoder audioDecoder = player.getAudioStreamDecoder(streamIndex);

表示返回的内容 implements IDecoder

e.g。

public IDecoder getAudioStreamDecoder() {
   // constructs...
   return new IDecoderImplementation(); 
}

请注意构造内容与返回引用之间的类型区别。

返回的对象将是一个具体的类,但由于它实现了该接口,因此该接口可以引用它。它可以实现其他接口,并且可以暴露功能,但您只能以IDecoder

的形式访问它

答案 1 :(得分:1)

仅仅是一些FYI:

根据jlibav API documentation,有两个类是IDecoder的具体实现:

  • AudioFrameDecoder
  • VideoFrameDecoder

您的IDecoder是这两个类之一的实例。 IDecoder还扩展了另外两个接口:

  • IFrameProducer
  • IPacketConsumer

ICodecContextWrapper同样如此。有三个已知的类实现该接口:

  • AbstractCodecContextWrapper
  • CodecContextWrapper53
  • CodecContextWrapper54

您的ICodecContextWrapper是这三个中的一个的实例。

这个概念叫做polymorphism。如果它令人困惑(而且很可能是初学者),你可能希望学习一些学习材料。