类型推断不是在多态函数中发生的

时间:2016-09-22 11:04:40

标签: scala functional-programming

我已经编写了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)}}}
}

1 个答案:

答案 0 :(得分:3)

第一个版本无法编译,因为您传递getLines的结果,其类型为Iterator[String]作为第一个参数。该参数必须采用def close(): Unit方法(由A <: {def close() : Unit}限定),Iterator[String]没有这样的方法。

第二个版本有效,因为Source作为A传递,符合绑定(具有匹配的close方法)