首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Scala抽象方法参数问题,T列表

Scala抽象方法参数问题,T列表
EN

Stack Overflow用户
提问于 2010-01-19 06:12:38
回答 3查看 402关注 0票数 0

我有一个帮助器方法:

代码语言:javascript
复制
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 
    } 
} 

调用时使用:

代码语言:javascript
复制
controlStructure[MySomeObject](classOf[Exception]) { getMySomeObjectSomehow } 

它的要点是在传入的实体上调用'callSomeMethod‘(例如,从ORM加载),顺便说一下,它在异常处理中也包装了一些东西。

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

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

谢谢你的帮助。

EN

回答 3

Stack Overflow用户

发布于 2010-01-19 06:50:15

对于scala列表,您需要的东西(我认为)如下所示:

代码语言:javascript
复制
  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 list,所以我猜你可以像这样用java.util.List来做:

代码语言:javascript
复制
  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
    } 
  }
票数 1
EN

Stack Overflow用户

发布于 2010-01-19 06:48:35

在Scala中没有名为vararg的参数。如果你想要这样,你必须传递一个函数。有关此效果,请参阅增强请求的this ticket

票数 0
EN

Stack Overflow用户

发布于 2010-01-20 00:42:25

谢谢你的帮助米奇。在这种情况下,答案是将方法的返回类型指定为java.util.ListT,因为一旦Scala没有使用其神奇的类型推断来解决所有问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2089616

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档