如何在Scala中使用PhantomReference

时间:2016-02-03 21:11:58

标签: scala garbage-collection

我正在尝试在Scala中实现Phantom Reference来替换finalize()。我有一个文件对象,需要使用Phantom Reference进行GC编辑。虽然java中有一些代码示例,但我无法在Scala中找到任何内容。我确实尝试过像Scala一样写作:

val q = new ReferenceQueue()
val phantom = new PhantomReference(file,q)

但是我收到以下错误

found   : java.lang.ref.ReferenceQueue[Nothing]
[error]  required: java.lang.ref.ReferenceQueue[_ >: java.io.File]
[error] Note: Nothing <: Any, but Java-defined class ReferenceQueue is invariant in type T.
[error] You may wish to investigate a wildcard type such as `_ <: Any`. (SLS 3.2.10)
[error]     val phantom = new PhantomReference(file,q)

我理解我错过了一些微不足道的东西,但我对Scala并不十分精通。有人可以帮忙吗?

1 个答案:

答案 0 :(得分:0)

由于类型推断在Scala中的工作方式,q被推断为java.lang.ref.ReferenceQueue[Nothing]类型,但您希望它是java.lang.ref.ReferenceQueue[File],因此您需要明确这一点当你创建它时:

val q = new ReferenceQueue[File]()