Scala абстрактный метод param вопрос, Список T - PullRequest
0 голосов
/ 19 января 2010

У меня есть вспомогательный метод:

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), он также случайно оборачивает вещи в обработку исключений

Теперь я хотел бы добавить новый метод, который делает то же самое, но для коллекции (java.util.List) из T.

Я не уверен в синтаксисе и структурах для работы с коллекцией T в сигнатуре метода и определениями параметров абстрактного типа.

Спасибо за вашу помощь.

Ответы [ 3 ]

1 голос
/ 19 января 2010

Со списком 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
    } 
  }

Я не работал со списками Java в Scala, поэтому я предполагаю, что вы могли бы сделать это с 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
    } 
  }
0 голосов
/ 19 января 2010

Спасибо за помощь, Митч. Оказывается, в данном случае ответ заключается в том, чтобы указать тип возвращаемого значения метода, например java.util.List [T], поскольку на этот раз Scala не использует свой вывод магического типа для сортировки всего.

0 голосов
/ 19 января 2010

В Скале нет прохода по имени vararg. Вы должны передать функцию, если хотите этого. См. этот билет запроса на улучшение этого эффекта.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...