2014-10-06 109 views
2

可以说,我想要写泛型函数foo,将使用模式匹配来检查传入的参数的类型是否为它的是一般的参数T模式匹配和(ereased)泛型函数类型参数

天真的尝试:

def foo[T]: PartialFunction[Any, Boolean] = { 
    case x: T => 
     true 
    case _ => 
     false 
    } 

...将不会工作,因为T得到升高。 Compiller警告确认:

Warning:(11, 13) abstract type pattern T is unchecked since it is eliminated by erasure 
    case x: T => 
      ^

让它工作的最佳方法是什么?

+2

请注意,类型匹配与函数式编程很少有关,它在Scala中被破坏的事实实际上是一件好事(它的部分支持以及该语言提供了诸如'ClassTag'的变通方法,这只是一种耻辱) 。 – 2014-10-06 12:37:52

+1

@ Travis:Eugeny的问题没有被标注为“函数式编程”,他也没有提到它。 Scala不仅仅是一种函数式编程语言,也是一种面向对象(甚至是命令式)的编程语言,为什么它不能提供解决方法?匹配类型在面向对象编程中非常有用。如果你不想面向对象,scala毕竟是错误的语言。 – 2014-10-07 10:27:10

+0

@Martin我的投诉并不是关于功能,而是关于Scala将它与模式匹配混合的事实(这可能是许多人第一次接触FP)。如果它有自己独特的语法(并且在泛型上没有可怕的问题),那肯定会很棒。 – 2014-10-07 12:26:09

回答

4

斯卡拉已经为此推出了ClassTag。他们可以通过一个隐含的参数来获得,并且会自动提供,这意味着你不必调用方法时不用担心参数:

import scala.reflect.ClassTag 

def foo[T](implicit tag: ClassTag[T]): PartialFunction[Any, Boolean] = { 
    case x: T => 
    true 
    case _ => 
    false 
} 

val isString = foo[String] // ClassTag gets provided implicitly here 

isString("Hallo") // will return true 
isString(42) // will return false 

如需进一步说明,请参见docs