Scala 如何为不同的X模式匹配类[X]?
我想检查方法的参数类型,但我不知道最好的方法。请参阅我的代码:Scala 如何为不同的X模式匹配类[X]?,scala,types,Scala,Types,我想检查方法的参数类型,但我不知道最好的方法。请参阅我的代码: class X { def x(a: Int, b: String) {} } val methods = classOf[X].getDeclaredMethods methods map { m => m.getParameterTypes.toList map { t => println(t.getName) // I don't know how to writ
class X {
def x(a: Int, b: String) {}
}
val methods = classOf[X].getDeclaredMethods
methods map { m =>
m.getParameterTypes.toList map { t =>
println(t.getName)
// I don't know how to write the following
if ( the type of t is Int) { do something}
else if( the type of t is String ) { do something}
else { }
}
}
请注意代码中的注释。我不知道如何用scala的方式检查类型
我试过:
t match {
case _:String => println("### is a string")
case _:Int => println("### is an int")
case _ => println("### ?")
}
但它不能被编译
我可以使用java方式检查:
if (t.isAssignableFrom(classOf[String])) // do something
else if(t.isAssignableFrom(classOf[Int])) // do something
else {}
看来我们应该在scala中使用它,对吗
更新: 如果我想使用
匹配
,我应该这样写:
t match {
case i if i.isAssignableFrom(classOf[Int]) => println("### is an Int")
case s if s.isAssignableFrom(classOf[String]) => println("### is a String")
case _ => println("###?")
}
这是最好的答案吗?我可以通过将案例定义为常量,将t作为一种类型来使用。它不会以类文本作为大小写表达式进行编译。尝试:
val S = classOf[String]
val I = classOf[Int]
t match {
case S => println("### is a string")
case I => println("### is an int")
case _ => println("### ?")
}
您可以使用
ClassManifest.fromClass
来正确处理将原语强制到anyVAL的问题,以及在使用反射时遇到的装箱类型与未装箱类型之间的任何其他问题
像这样:
import reflect.ClassManifest
class Wibble { def method(a:Int, b: String) = () }
for(method <- classOf[Wibble].getDeclaredMethods; paramType <- method.getParameterTypes) {
ClassManifest.fromClass(paramType) match {
case m if m <:< ClassManifest.Int => println("Interiffic")
case m if m <:< ClassManifest.Float => println("Floaty, like butterflies")
case m if m <:< ClassManifest.Double => println("Or Quits...")
//todo: all the other AnyVal types...
case m if m <:< classManifest[String] => println("bleeding edge physics, yeah baby!")
//...and a default condition
}
}
import reflect.ClassManifest
类Wibble{def方法(a:Int,b:String)=()}
对于(方法最后一行中的“++>”是什么意思?“++>”可能是一个打字错误,应该是“=>”这是一个打字错误,我刚刚修复了它。谢谢。它仍然不能在这里编译。因为t
这里是一个类
,不是一个正常的实例。请注意,在s
和I
参数不同的情况下,这不起作用相同类型的zed实例,例如S=classOf[List[String]]
和I=classOf[List[Int]]
我能做的最好的事情是:val L=classOf[:::[\u]],它允许case L匹配不可变列表(scala.collection.immutable.:)。不幸的是,泛型类型似乎在运行时被删除,所以::[任何东西]都会匹配::[任何东西]。我认为Kevin Wright在清单方面有了一个更具前景的想法,这不仅仅适用于简单的案例。我成功地使用guards制作了一行程序:case x if x==classOf[String]
@Keven,谢谢,但我必须说,@freewend-这只是类清单
上检查子类型关系的一个方法。没有什么棘手的:)@freewend-你也可以使用=
而不是