【问题标题】:How to do instanceOf of a variable of a class (not a class type) in scala如何在scala中对类(不是类类型)的变量进行instanceOf
【发布时间】:2020-01-28 14:08:54
【问题描述】:

我想用isInstanceOf来决定一个变量的类型, 但是isInstanceOf[T] 需要 T 并且 T 必须是在编译时确定的类。我希望我可以把它变成一个变量。

查看示例代码:

class A{ ... }
class B{ ... }

val class_map = Map( classOf[A] -> 1, classOf[B] -> 2 )
val a = new A()
class_map.keys foreach { i =>
   if (a.isInstanceOf[ i ])  // how to make this statement work?
     println(class_map[i])
}

【问题讨论】:

  • isInstanceOf 通常是代码异味,这看起来像是 XY 问题,您能描述一下您想要解决的更广泛的问题吗?可能有更好的选择。

标签: scala types


【解决方案1】:

你可以使用Class对象的isInstance方法:

val matchingValues = class_map.collect {
  case (clazz, value) if clazz.isInstance(a) => value
}

matchingValues foreach println

【讨论】:

    【解决方案2】:

    如果我是你,我会采取不同的方法,大致如下:

    sealed trait Arg
    case class A{ ... } extends Arg
    case class B{ ... } extends Arg
    
    val class_map: Arg => Int = {
      case A => 1
      case B => 2
    }
    
    val a = new A()
    println(class_map(a)) // will print 1
    

    【讨论】:

    • 如果A是一个类,我认为你不能写case A => 1
    • @worldterminator 相反,这就是模式匹配的用途。而且,你为什么不自己试试呢?
    • @worldterminator 道歉,我没有意识到那些不是案例类 :facepalm: 。一旦你这样做了,它就会编译并工作(稍微调整匹配块的语法)。
    猜你喜欢
    • 1970-01-01
    • 2017-11-29
    • 2018-05-03
    • 1970-01-01
    • 2013-02-10
    • 2010-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多