我正在阅读(好的,略读) Dubochet 和 Odersky 的Compiling Structural Types on the JVM,并对以下声明感到困惑:
生成技术创建 Java 接口来代替 JVM 上的结构类型。这种技术的复杂性在于,在程序中任何地方用作结构类型的所有类都必须实现正确的接口。当这在编译时完成时,它会阻止单独编译。
(重点补充)
考虑论文中的自动关闭示例:
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
is a FileInputStream
,它没有实现AnonymousInterface1
,我们需要生成一个包装器:
class FileInputStreamAnonymousInterface1Proxy(val self: FileInputStream)
extends AnonymousInterface1 {
def close() = self.close();
}
object FileInputStreamAnonymousInterface1Proxy {
implicit def fis2proxy(fis: FileInputStream): FileInputStreamAnonymousInterface1Proxy =
new FileInputStreamAnonymousInterface1Proxy(fis)
}
我一定错过了什么,但我不清楚它是什么。为什么这种方法会阻止单独编译?