我已经编写了2个版本的代码,如下所示。在第一个版本中,我得到如下运行时错误,无法理解为什么我在传递Iterator类型函数时遇到错误:使用。在版本2中它运行正常,同时为函数传递资源类型:使用。
错误:(23,11)推断类型参数[Iterator [String],Nothing]不符合使用&n;类型参数边界的方法[A&lt ;: AnyRef {def close():Unit},B ] control.using(Source.fromFile(" C:\ Users \ pswain \ IdeaProjects \ test1 \ src \ main \ resources \ employee")。getLines){a => {for(line< - a){println(line)}}} ^
第一版: -
/**
* Created by PSwain on 9/22/2016.
*/
import java.io.{IOException, FileNotFoundException}
import scala.io.Source
object control {
def using[ A <: {def close() : Unit},B ] (resource : A) (f: A => B) :B =
{
try {
f(resource)
} finally {
resource.close()
}
}
}
object fileHandling extends App {
control.using(Source.fromFile("C:\\Users\\pswain\\IdeaProjects\\test1\\src\\main\\resources\\employee").getLines){a => {for (line <- a) { println(line)}}}
}
第二版
/**
* Created by PSwain on 9/22/2016.
*/
import java.io.{IOException, FileNotFoundException}
import scala.io.Source
object control {
def using[ A <: {def close() : Unit},B ] (resource : A) (f: A => B) :B =
{
try {
f(resource)
} finally {
resource.close()
}
}
}
object fileHandling extends App {
control.using(Source.fromFile("C:\\Users\\pswain\\IdeaProjects\\test1\\src\\main\\resources\\employee")){a => {for (line <- a.getLines) { println(line)}}}
}
答案 0 :(得分:3)
第一个版本无法编译,因为您传递getLines
的结果,其类型为Iterator[String]
作为第一个参数。该参数必须采用def close(): Unit
方法(由A <: {def close() : Unit}
限定),Iterator[String]
没有这样的方法。
第二个版本有效,因为Source
作为A
传递,符合绑定(具有匹配的close
方法)