簡體   English   中英

檢查Scala類是否是T的實例

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM