MPS 2019.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になります。

プロジェクトのバイトコードバージョンのその他のオプションは1.6、1.7、1.8です。

ビルドスクリプト

また、プロジェクトのビルドスクリプトで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 スタブとして追加して使用することもできます。

バージョン1.8以降、Java インターフェースにはデフォルトメソッドと静的メソッドを含めることができます。現時点では、MPSはBaseLanguageコードで作成することをサポートしていませんが、外部Javaクラス、たとえばJavaプラットフォームのクラスで定義された静的メソッドとデフォルトメソッドを呼び出すことができます。

静的インターフェースメソッド呼び出し

Screen Shot 2015 01 22 at 02 52 51

例では、Comparator.reverseOrder()でリストをソートします。Comparatorjava.utilからのインターフェースであり、reverseOrder()はJava 1.8で導入されたその静的メソッドです。

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

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()が取るパラメータのタイプを認識しており、消費者の正しいインスタンスに対して正確に生成されます。

最終更新日: 2019年7月5日