首页 > 解决方案 > 用一种方法包装泛型函数调用

问题描述

我有这样的事情:

...
case BooleanType => 
  try {
    reader.getBooleanValue()
  } catch {
    case e: IllegalStateException => throwMyException()
  }
case IntegerType => 
  try {
    reader.getIntValue()
  } catch {
    case e: IllegalStateException => throwMyException()
  }
...etc

但这是很多重复的代码。必须有一种方法可以执行以下操作:

case BooleanType => tryGetReaderSafely(reader.getBooleanValue())
case IntegerType => tryGetReaderSafely(reader.getIntValue())
..etc

我很好奇的方法是

def tryGetReaderSafely(reader: Reader): Any = {
  try {
    reader.getType // how do I do the correct call here?
  } catch {
    case e: IllegalStateException => throwMyException()
  }
}

问题是我将函数结果而不是函数本身传递给调用——我知道你可以使用回调,但我仍然不确定如何使用回调来调用正确的reader.getType方法

标签: scala

解决方案


尝试:

def tryGetReaderSafely[T](reader: Reader, f: Reader => T): T =
  try {
    f(reader)
  } catch {
    case e: IllegalStateException => throwMyException()
  }

用法:

case BooleanType => tryGetReaderSafely(reader, _.getBooleanValue)
case IntegerType => tryGetReaderSafely(reader, _.getIntValue)

推荐阅读