[英]Check if Scala class is instance of T
我的應用程序處理了很多第三方集成。 我有一個用於第三方集成的抽象基類,它指定了一組集成類應該處理的方法 - 然后可以使用所有集成中不可用的其他功能擴展某些集成。
基本上它看起來像這樣:
abstract class Integration { ... }
trait SingleSignOn { ... }
class NormalIntegration extends Integration {}
class SingleSignOnIntegration extends Integration with SingleSignOn {}
我希望能夠整理出具有特定特征的所有集成,這就是我認為的基本解決方案:
val allIntegrations: Seq[Integration] = ...
def integrationsWithTrait[T]: Seq[Integration] = {
allIntegrations.filter(_.isInstanceOf[T])
}
用法是:
val singleSignOnIntegrations = integrationsWithTrait[SingleSignOn]
問題是isInstanceOf[T]
總是返回true(意味着我最終得到singleSignOnIntegrations == allIntegrations
),而硬編碼的isInstanceOf[SingleSignOn]
按預期工作。
如何修復integrationsWithTrait
按照我的意圖工作?
這將有效:
def integrationsWithTrait[T](implicit tag: scala.reflect.ClassTag[T]): Seq[Integration] = {
allIntegrations.filter(tag.runtimeClass.isInstance)
}
Scalac將為每個將調用此方法的類注入ClassTag
實例。 這將允許在運行時訪問Class
對象並驗證該類是否是給定類/ trait的實例。
我認為由於類型擦除原始代碼不起作用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.