-2

可能重复:
为什么不使用接口类型的这些变量来实例化新对象?

在下面来自我正在使用的API的代码示例中,有一个变量“audiodecoder”和“cc”的初始化。这两个变量是接口类型。但是,关键字implements在代码示例中的任何地方都没有使用,除了 actionlisteners。

这与我迄今为止所学到的有关 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();
4

2 回答 2

13

IDecoder audioDecoder = player.getAudioStreamDecoder(streamIndex);

意味着无论返回什么都实现 IDecoder

例如

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

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

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

于 2013-01-03T16:35:07.227 回答
1

仅供参考:

根据jlibav API 文档,有两个类是具体实现IDecoder

  • AudioFrameDecoder
  • VideoFrameDecoder

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

  • IFrameProducer
  • IPacketConsumer

对于ICodecContextWrapper. 实现该接口的三个已知类:

  • AbstractCodecContextWrapper,
  • CodecContextWrapper53, 和
  • CodecContextWrapper54

ICodecContextWrapper是这三个之一的一个实例。

这个概念称为多态性。如果它令人困惑(而且它很可能适合初学者),您可能希望拿起一些学习材料。

于 2013-01-03T16:41:09.880 回答