MPS 2020.1 ヘルプ

MPS Java との互換性

構成

設定ウィンドウの Java コンパイラー設定タブにはプロジェクトのバイトコードバージョンという 1 つの設定しかありません。

Screen Shot 2015 01 30 at 17 20 40

この設定は、MPS によってコンパイルされたすべての Java クラスのバイトコードバージョンを定義します。これらのクラスには、言語の側面から生成されたクラス、ランタイムソリューションのクラス、サンドボックスソリューションのクラスなどがあります。

デフォルトでは、バイトコードのバージョンは JDK Default に設定されています。つまり、コンパイルされたクラスのバージョンは、MPS が実行されている Java のバージョンと同じになります。例:MPS を JDK 1.8 で実行し、JDK Default が選択されている場合、バイトコードのバージョンは 1.8 になります。

各モジュールは、Java タブのモジュールプロパティで Java レベルを指定できます。このようにして、選択した言語レベルの機能のみが、そのモジュールの BaseLanguage コードで有効になります。

Java compatibility

ビルドスクリプト

また、プロジェクトのビルドスクリプトで java 準拠レベルを設定することを忘れないでください。プロジェクトのバイトコードバージョンと同じでなければなりません。

Screen Shot 2015 01 29 at 18 08 28

JDK 1.8 でコンパイルされた java クラスを使用する

MPS モジュールプールには、実行中の Java のクラスを保持する JDK ソリューションがあります。そのため、JDK 1.8 で MPS を起動すると、JDK ソリューションで最新の Java プラットフォームクラスが利用可能になります。

JDK 1.8 でコンパイルされた外部 Java クラスを Java スタブとして追加して使用することもできます。

デフォルトのインターフェースメソッド

Java 8 ではデフォルトのメソッドも導入されました。これらはインターフェースに直接実装されたメソッドです。ここでデフォルトのメソッドについて読むことができます:http://docs.oracle.com/javase/tutorial/java/IandI/defaultmethods.html(英語)

これらのメソッドは、通常のインスタンスメソッドとまったく同じように呼び出すことができます。ただし、クラスが実装しているインターフェースから直接デフォルトのメソッドを呼び出す必要がある場合があります。例:クラスが複数のインターフェースを実装していて、それぞれが同じシグネチャーを持つデフォルトのメソッドを含んでいるときに多重継承の場合。

public interface A {   public default void foo() {     System.out.println("A");    } } public interface B {   public default void foo() {     System.out.println("B");    } }

その場合、foo() は、jetbrains.mps.baseLanguage.jdk8 言語に新しく配置された SuperInterfaceMethodCall 構造を介して、インターフェースの 1 つで明示的に呼び出すことができます。

Screen Shot 2015 01 29 at 20 39 29

jetbrains.mps.baseLanguage.jdk8 言語により、ユーザーは BaseLanguage インターフェースで「デフォルト」メソッドを作成できます。

comx1

'default' キーワードは、BaseLanguage の修飾子概念を拡張する DefaultModifier 概念によって実装されています。

変換 / 代替メニュー + いくつかの居心地の良いインテンションも提供されています。

comx2
comx3

Java プラットフォーム API の使用

Java 8 ではラムダ式が導入されました。これについては、ここで詳しく説明します。: http://docs.oracle.com/javase/tutorial/java/javaOO/lambdaexpressions.html(英語)

MPS はラムダ式に生成される言語をまだ持っていません。代わりに、新しい Java API と互換性のある独自のクロージャ言語があります。

新しい JDK 8 Collections API との対話の例を示します。

Screen Shot 2015 01 29 at 18 03 43

forEach() 方法は java.lang.Iterable の新しいデフォルトの方法です。消費者インターフェースをパラメーターとして使用します。消費者は、メソッドが 1 つしかないため、機能的なインターフェースです。Java 8 では、ラムダ式を forEach() に渡すことができます。MPS では、MPS クロージャーを渡すことができます。クロージャは、生成中に forEach() によって取得されたパラメーターのタイプを認識しており、消費者の正しいインスタンスに対して正確に生成されます。

最終更新日 : 2020 年 6 月 18 日