简体   繁体   English

检查Scala类是否是T的实例

[英]Check if Scala class is instance of T

My application handles a lot of third party integrations. 我的应用程序处理了很多第三方集成。 I have an abstract base class for third party integrations which specifies a bunch of methods that an integration class should handle – then certain integrations can be extended with additional functionality that is not available on all integrations. 我有一个用于第三方集成的抽象基类,它指定了一组集成类应该处理的方法 - 然后可以使用所有集成中不可用的其他功能扩展某些集成。

Basically it looks like this: 基本上它看起来像这样:

abstract class Integration { ... }
trait SingleSignOn { ... }

class NormalIntegration extends Integration {}
class SingleSignOnIntegration extends Integration with SingleSignOn {}

I would like to be able to sort out all integrations that have a specific trait, and this is what I thought of as the basic solution: 我希望能够整理出具有特定特征的所有集成,这就是我认为的基本解决方案:

val allIntegrations: Seq[Integration] = ...

def integrationsWithTrait[T]: Seq[Integration] = {
  allIntegrations.filter(_.isInstanceOf[T])
}

The usage is: 用法是:

val singleSignOnIntegrations = integrationsWithTrait[SingleSignOn]

The issue is that isInstanceOf[T] always returns true (meaning I end up with singleSignOnIntegrations == allIntegrations ), while hard coded isInstanceOf[SingleSignOn] works as intended. 问题是isInstanceOf[T]总是返回true(意味着我最终得到singleSignOnIntegrations == allIntegrations ),而硬编码的isInstanceOf[SingleSignOn]按预期工作。

How do I fix integrationsWithTrait to work as I intend? 如何修复integrationsWithTrait按照我的意图工作?

This will work: 这将有效:

def integrationsWithTrait[T](implicit tag: scala.reflect.ClassTag[T]): Seq[Integration] = {
  allIntegrations.filter(tag.runtimeClass.isInstance)
}

Scalac will inject ClassTag instance for every class that this method will be called with. Scalac将为每个将调用此方法的类注入ClassTag实例。 This will allow to access the Class object in runtime and verify if the class is the instance of given class/trait. 这将允许在运行时访问Class对象并验证该类是否是给定类/ trait的实例。

I think the original code doesn't work because of type erasure. 我认为由于类型擦除原始代码不起作用。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM