我不喜欢 Scala 的 isInstanceOf 和 asInstanceOf 方法——它们很长而且 asInstanceOf 会抛出异常,所以我们需要同时使用它。更好的方法是使用模式匹配:Scala: How do I cast a variable? 但对于非常简单的操作,它也可能相对较长。在 C# 中,我们有 'is' 和 'as' 运算符,所以我想在 Scala 中用 this 实现隐式定义。我的代码如下所示:
scala> class TypeCast(x:Any){
| def is[T](t:Class[T]) = t.isInstance(x)
| def as[T](t:Class[T]):Option[T] = if(t.isInstance(x)) Option(t.cast(x)) else None
| }
defined class TypeCast
scala> implicit def TypeCastID(x:Any)=new TypeCast(x)
TypeCastID: (x: Any)TypeCast
scala> 123 as classOf[String]
res14: Option[String] = None
scala> "asd" as classOf[String]
res15: Option[String] = Some(asd)
它有一个优点 - 实现空对象模式,但也有缺点:
需要使用 classOf[T] 运算符 - 它太长了
对于这种简单的操作,与隐式 def 相关的开销
所以没有实际的理由使用它。我想知道有没有什么方法可以在不需要使用 classOf[T] 的情况下实现这一点?