0

我有一个辅助方法:

def controlStructure[T <: SomeObject](exceptions: Class[_]*)(body: => T) = { 
    try { 
        val tempObject = body 
        tempObject.callSomeMethod 
        Some(tempObject) 
    } catch { 
        case e if (exceptions.contains(e.getClass)) => None 
    } 
} 

调用:

controlStructure[MySomeObject](classOf[Exception]) { getMySomeObjectSomehow } 

其要点是在传入的实体上调用“callSomeMethod”(例如从 ORM 加载),它也顺便将事物包装在异常处理中。

我现在想添加一个新方法,它做同样的事情,但用于 T 的集合(java.util.List)。

我不确定在方法签名中使用 T 集合的语法和结构,以及抽象类型参数定义。

谢谢你的帮助。

4

3 回答 3

1

使用 scala 列表,您想要这样的东西(我认为):

  def controlStructure[T <: SomeObject](exceptions: Class[_]*)(body: => List[T]) = {
    try {
      val tempObject = body
      tempObject.foreach { _.callSomeMethod() }
      Some(tempObject)
    }
    catch {
      case e if (exceptions.contains(e.getClass)) => None
    } 
  }

我没有在 scala 中使用过 Java 列表,所以我猜你可以像这样使用 java.util.List 来做到这一点:

  def controlStructure[T <: SomeObject](exceptions: Class[_]*)(body: => java.util.List[T]) = {
    import scala.collection.JavaConversions._
    try {
      val tempObject = body
      tempObject foreach { _.callSomeMethod() }
      Some(tempObject)
    }
    catch {
      case e if (exceptions.contains(e.getClass)) => None
    } 
  }
于 2010-01-18T22:50:15.340 回答
0

感谢您的帮助米奇。事实证明,在这种情况下,答案是指定方法的返回类型,如 java.util.List[T],因为 Scala 没有使用其魔法类型推断来解决所有问题。

于 2010-01-19T16:42:25.363 回答
0

Scala 中没有名称可变参数。如果你想要这个,你必须传递一个函数。请参阅此增强请求票证。

于 2010-01-18T22:48:35.063 回答