Dubochet and Odersky's Compiling Structural Types on the JVMを読んでいて (わかりました、スキミング)、次の主張に混乱しました。
ジェネレーティブ手法は、JVM 上の構造型に代わる Java インターフェースを作成します。このような手法の複雑さは、プログラム内の任意の場所で構造型として使用されるすべてのクラスが適切なインターフェイスを実装する必要があることにあります。これがコンパイル時に行われると、個別のコンパイルが妨げられます。
(強調追加)
論文の autoclose の例を考えてみましょう:
type Closeable = Any { def close(): Unit }
def autoclose(t: Closeable)(run: Closeable => Unit): Unit = {
try { run(t) }
finally { t.close }
}
次のような型のインターフェイスを生成できませんでしたCloseable
:
public interface AnonymousInterface1 {
public void close();
}
の定義autoclose
を
// UPDATE: using a view bound here, so implicit conversion is applied on-demand
def autoclose[T <% AnonymousInterface1](t: T)(run: T => Unit): Unit = {
try { run(t) }
finally { t.close }
}
次に、 の呼び出しサイトを検討しますautoclose
。
val fis = new FileInputStream(new File("f.txt"))
autoclose(fis) { ... }
fis
はFileInputStream
を実装していないため、AnonymousInterface1
ラッパーを生成する必要があります。
class FileInputStreamAnonymousInterface1Proxy(val self: FileInputStream)
extends AnonymousInterface1 {
def close() = self.close();
}
object FileInputStreamAnonymousInterface1Proxy {
implicit def fis2proxy(fis: FileInputStream): FileInputStreamAnonymousInterface1Proxy =
new FileInputStreamAnonymousInterface1Proxy(fis)
}
何かが欠けているに違いありませんが、それが何であるかは不明です。このアプローチが個別のコンパイルを妨げるのはなぜですか?