Как проверить значение видимых типов - PullRequest
3 голосов
/ 17 ноября 2011

У меня есть что-то вроде этого:

def my_check[T](arg: T) = arg match {
  case x: GenTraversable[_] = ...  // XX
  case x: Array[_]
   ...

Я хочу объединить некоторое cases выражение:В приведенном выше коде, отмеченном знаком XX, я хочу проверить, если arg <: GenTraversable[_] или arg <% GenTraversable[-].Например, тип Array также может соответствовать этому случаю (существует неявное преобразование из Array в WrapperArray <: GenTraversable)

Я не хочу использовать исключение в решении, поэтому яне интересно что-то вроде:

try:
  val trv: GenTraversable = arg
catch ...

Я пробовал в my_check функцию что-то вроде

T <:< GenTraversable        // error: not found: value T

Но компилятор жалуется.

Ответы [ 3 ]

2 голосов
/ 17 ноября 2011

Неявное разрешение (<% включено) - это время компиляции, основанное на типах, которые известны во время компиляции. </p>

В вашей процедуре единственное, что известно во время компиляции об аргументе arg, это то, что он имеет тип T, что ни о чем. У вас может быть что-то типа

def check[T <% GenTraversable[_](arg: T) = ...

Это определенно не то же самое, однако ваша подпрограмма может быть вызвана, только если во время компиляции известно, что arg равно GenTraversable.

Я не знаю, где вы написали T <:< GenTraversable[_] (вероятно, в месте, где ожидается значение). Чтобы получить неявное преобразование типов A в B, вы можете написать implicitly[A => B], но, опять-таки, произойдет сбой, если его не удастся разрешить во время компиляции. Так что здесь не поможет, с T неограниченным родовым параметром.

1 голос
/ 17 ноября 2011

Я не уверен, что понимаю ваш вопрос. Этот код работает для меня:

class X[T] (name: T)

class Y[T] (_name: T, age: Int) extends X[T](_name)

def foo[T](arg: T) = arg match {
  case a: Y[_] => println("y " )
  case a: X[_] => println("x " )
  case _ => println("?")
}

val y = new Y("Olle", 3);
foo(y)

Если Y является подклассом X (как в этом случае), тогда вы должны начать с Y и позже взять более общие классы. Пожалуйста, объясните вопрос еще раз ...?

0 голосов
/ 17 ноября 2011

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

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