Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

クラスとインターフェースの拡張

💡 お知らせ: このドキュメントはAIによって翻訳されています。表現に違和感がある場合は、原文(英語)を参照するか、翻訳にご協力ください。

Flix では、Java のクラスを継承したり、Java のインターフェースを実装したりするオブジェクトを作成できます。

この機能は、概念的には Java の匿名クラス(Anonymous Classes)に似ています。つまり、インターフェースを実装する、あるいはクラスを継承する(名前のない)クラスを定義し、そのクラスのオブジェクトを生成する、という一連の処理を 1 つの式で行うことができます。

例えば、java.lang.Runnable インターフェースを実装するオブジェクトは次のように作成できます:

import java.lang.Runnable

def newRunnable(): Runnable \ IO = new Runnable {
    def $run(_this: Runnable): Unit \ IO = 
        println("I am running!")
}

newRunnable を呼び出すたびに、java.lang.Runnable を実装した新しいオブジェクトが得られます。

注意: 暗黙の this 引数は、new 式の中では常に第 1 引数として明示的に渡されます。

別の例として、java.io.Closeable インターフェースを実装するオブジェクトも作成できます:

import java.io.Closeable

def newClosable(): Closeable \ IO = new Closeable {
    def close(_this: Closeable): Unit \ IO = 
        println("I am closing!")
}

クラスを継承することもできます。例えば、hashCode メソッドと toString メソッドをオーバーライドした java.lang.Object を作成できます:

def newObject(): Object \ IO = new Object {
    def hashCode(_this: Object): Int32 = 42
    def toString(_this: Object): String = "Hello World!"
}

スーパーメソッドの呼び出し

匿名サブクラスでメソッドをオーバーライドするとき、super.methodName(args) を使って親クラスの実装を呼び出すことができます。

例えば、Thread を継承して toString をオーバーライドし、親クラスのデフォルトの表現を含めることができます:

import java.lang.Thread

def main(): Unit \ IO =
    let t = new Thread {
        def new(): Thread \ IO = super("my-thread")
        def run(_this: Thread): Unit \ IO =
            println("Hello from ${Thread.currentThread().getName()}")
        def toString(_this: Thread): String \ IO =
            "MyThread(" + super.toString() + ")"
    };
    println(t)

ここで super.toString() は、(親クラスである)Thread が定義する toString メソッドを呼び出し、その結果を "MyThread(...)" で包んでいます。

注意: スーパーメソッド呼び出しは new 式の内部、すなわち匿名サブクラスを定義するときにのみ使用できます。