Тип соответствия шаблона Тип возвращаемого результата - PullRequest
0 голосов
/ 28 января 2012

РЕДАКТИРОВАТЬ
Оставляя это для потомков, но почти год спустя, чтобы получить голосование, приятно ... не будет делать ничего подобного ниже, но в то время, начиная сScala, вопросы обычно приходят из места невежества ....

ORIGINAL
Я знаю, что могу просто обернуть соответствие шаблону в методе с универсальным типом, заданным так:

def getTeam[T <: _Team](clazz: String): _Team =
  clazz match {
    case "roster" => new RosterController
    case "schedule" => new ScheduleController
  }

и получите значимый тип (_Team) для работы с компилятором.

Однако мне интересно, можно ли сделать это БЕЗ метода обертки и без шаблона asInstanceOf [_Team]?то есть что-то отличное от

clazz match {
  case "roster" => new RosterController.asInstanceOf[_Team]
  case "schedule" => new ScheduleController.asInstanceOf[_Team]
}

Не конец света, если это невозможно, но он предпочел бы проводить матчи на месте, а не разделять на отдельные методы.

Спасибо

Ответы [ 2 ]

2 голосов
/ 28 января 2012

Я не уверен, что вы думаете, что происходит в этом методе, но кажется, что вы либо сбиты с толку, либо написали не то.

В вашем примере T - это параметр типа, ограниченный выше типом _Team (который, я полагаю, является либо классом, либо признаком). Впоследствии вы игнорируете T, так что может быть фантомным типом, но по вашему вопросу, но на самом деле это не так.

Вы не можете преобразовать RosterController в _Team, потому что он либо равен единице, либо нет. Я могу сделать вывод, что RosterController должен быть конкретным классом, как вы его создаете. Это либо подтип _Team, либо нет.

Если _Team является признаком, его можно смешать в:

new RosterController with _Team

Но поскольку вы не объясняете, что вы на самом деле пытаетесь сделать, трудно сказать наверняка! RosterController также параметризован?

<Ч />

EDIT - из приведенных ниже комментариев кажется, что вы задаетесь вопросом о том, что выводит компилятор как тип результата выражения, где это выражение является оператором match.

Вот полезный пример того, как компилятор может сделать действительно много интересных вещей

scala> class Bar; class Baz; trait Foo
defined class Bar
defined class Baz
defined trait Baz

Теперь давайте создадим выражение соответствия:

scala> def foo(s: String) = s match {
   | case "a" => new Baz with Foo
   | case _   => new Bar with Foo
   | }
foo: (s: String)ScalaObject with Foo

Итак, компилятор правильно сделал вывод Foo здесь. Возможно, вы могли бы перефразировать ваш вопрос, указав в REPL примере , что именно вы ожидаете и чем это отличается от того, что на самом деле происходит.

1 голос
/ 29 января 2012

trait _Team {def doWhat_TeamCanDo (s: String) {println s}}

class MyTeamString(clazz: String)

 implicit def getTeam: _Team =
  clazz match {
    case "roster" => new RosterController with _Team
    case "schedule" => new ScheduleController with _Team
 }
}

implicit def strToMyTeamString(s:String):MyTeamString= MyTeamString(s)

теперь вы можете неявно преобразовывать любую строку в _Team, когда вам это нужно:

"roster".doWhat_TeamCanDo("foo")
...