【问题标题】:Scala isInstanceOf[T] function fail to use bounded ClassTag/TypeTagScala isInstanceOf[T] 函数无法使用有界 ClassTag/TypeTag
【发布时间】:2016-09-12 21:40:18
【问题描述】:

以下代码:

abstract class Foo[T: ClassTag] {
    def v(a: Any): Any = a match {
        case _ if a.isInstanceOf[T] => Some(a)
        case _ => None
    }
}

在编译中产生以下内容:

Warning: abstract type T is unchecked since it is eliminated by erasure
    case _ if a.isInstanceOf[T] =>

奇怪的是,大小写匹配会按预期工作。有没有办法让 isInstanceOf[T] 也知道 ClassTag 上下文绑定?

【问题讨论】:

    标签: scala context-bound


    【解决方案1】:

    我不会说这是按预期工作的:

    scala> (new Foo[String] {}).v(List(1))
    res10: Any = Some(List(1)) // Not a String!
    

    不要使用isInstanceOf,因为它根本不使用ClassTags。您可以改用ClassTag 提取器:

    abstract class Foo[T: ClassTag] {
        def v(a: Any) = a match {
            case _: T => Some(a)
            case _ => None
        }
    }
    
    scala> (new Foo[String] {}).v(1)
    res3: Option[Any] = None
    
    scala> (new Foo[String] {}).v("abc")
    res4: Option[Any] = Some(abc)
    

    这是所有语法糖:

    abstract class Foo[T](implicit ct: ClassTag[T]) {
        def v(a: Any) = a match {
            case ct(a) => Some(a)
            case _ => None
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-02
      • 1970-01-01
      • 2020-04-18
      • 2022-10-16
      • 2012-10-25
      • 1970-01-01
      相关资源
      最近更新 更多