我有这样的事情:
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
但编译器抱怨。
答案 0 :(得分:2)
隐式解析(&lt;%included)是编译时的事情,基于编译时已知的类型。
在你的例程中,编译时唯一知道arg的是它是T
类型,它什么都没有。你可能有像
def check[T <% GenTraversable[_](arg: T) = ...
这绝对不是一回事,但是如果arg
在编译时已知为GenTraversable
,则只能调用您的例程。
我不知道你在哪里写T <:< GenTraversable[_]
(可能在预期值的地方)。要获得从类型A
到B
的隐式转换,您可以编写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存在。