【问题标题】:Why can't I import from com.sun.media.sound?为什么我不能从 com.sun.media.sound 导入?
【发布时间】:2022-01-09 16:05:54
【问题描述】:

我想使用 Java JDK 中包含的音频合成器和 midi 类。 MidiSystem.getSynthesizer() 返回一个合成器。调试显示实际类是 SoftSynthesizer。所以这个测试通过了:

    @Test
    void defaultSynth() throws MidiUnavailableException {
        Synthesizer synthesizer = MidiSystem.getSynthesizer();
        assertEquals("SoftSynthesizer", synthesizer.getClass().getSimpleName());
    }

但我无法使用 SoftSynthesizer 类和 AudioSynthesizer 接口(它扩展了 Synthesizer,并实现了 SoftSynthesizer)。

下面,AudioSynthesizer 和 SoftSynthesizer 被注释掉,因为它们不能解析。

   void foo() {
        // Resolved symbol
        Synthesizer s = null;

        // Unresolved symbols
        //AudioSynthesizer as = null;
        //SoftSynthesizer ss = null;
    }

一个区别是这些库和接口来自不同的包。从com.sun.media.sound 导入不起作用。

import javax.sound.midi.Synthesizer;
//import com.sun.media.sound.AudioSynthesizer;
//import com.sun.media.sound.SoftSynthesizer;

但是这两个包似乎都包含在 JDK 中,那么这有什么关系(如果有的话)?

在 IntelliJ、MacOS 上使用 Java-11 和 Java-17 (Azul) 进行测试。使用 Maven。

【问题讨论】:

  • 我不认为 JDK 包含任何超过 Java 8 的 com.sun 包...在 synthesizer.getClass() 上,完整的包名称是什么?
  • @OneCricketeer:全类名是“com.sun.media.sound.SoftSynthesizer”。所以是的,它包含在 JDK 中,只是无法访问。

标签: java java-11 java-17


【解决方案1】:

JDK 9 以来的大多数内部 API(自 JDK 9 起)无法访问 JDK 外部的代码 请参阅JEP 260:封装大多数内部 API 以了解详细信息和潜在的解决方法。

【讨论】:

  • 这似乎是原因。但是 JEP 260 没有说明该规则的任何细节。而且我想知道我是否应该尝试在某些依赖于 Maven 的情况下找到 AudioSynthesizer 和 SoftSynthesizer 的替代品,以及找到它的最佳方法是什么。
  • 为什么 JEP 260 应该“说明规则的任何细节”?官方 API 包含 the official API documentation 中记录的内容,其中未包含的内容从未成为 API 的一部分。就这么简单。
猜你喜欢
  • 2019-12-02
  • 2023-03-20
  • 2018-05-05
  • 1970-01-01
  • 2018-08-30
  • 2020-12-23
  • 2018-01-12
  • 2021-11-24
  • 2020-04-24
相关资源
最近更新 更多