如何检查值可查看的类型

时间:2011-11-17 12:13:26

标签: scala polymorphism match

我有这样的事情:

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

我想合并一些cases表达式:
在上面标有XX的代码中,我想检查arg <: GenTraversable[_]arg <% GenTraversable[-]。例如,Array类型也可以匹配此案例(存在从ArrayWrapperArray <: GenTraversable的隐式转换)

我不想在解决方案中使用异常,所以我对以下内容并不感兴趣:

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

我在my_check函数中试过像

这样的函数
T <:< GenTraversable        // error: not found: value T

但编译器抱怨。

3 个答案:

答案 0 :(得分:2)

隐式解析(&lt;%included)是编译时的事情,基于编译时已知的类型。

在你的例程中,编译时唯一知道arg的是它是T类型,它什么都没有。你可能有像

这样的东西
def check[T <% GenTraversable[_](arg: T) = ...

这绝对不是一回事,但是如果arg在编译时已知为GenTraversable,则只能调用您的例程。

我不知道你在哪里写T <:< GenTraversable[_](可能在预期值的地方)。要获得从类型AB的隐式转换,您可以编写implicitly[A => B],但如果在编译时无法解析,则会失败。所以这里没有任何帮助,T是一个无约束的泛型参数。

答案 1 :(得分:1)

我不确定我理解你的问题。这段代码适合我:

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开头并稍后使用更通用的类。请再次解释一下这个问题......?

答案 2 :(得分:0)

我很确定这是不可能的。模式匹配在运行时发生,implicits和non-implicits之间的区别仅在complile-time存在。