2013-06-25 128 views
0
def getParentOfType[T <: PsiElement](element: PsiElement, aClass: Class[T], strict: Boolean = false): Option[T] = { 
    System.out.println(aClass.isInstance(element), aClass, element.getClass) 
    ... 

getParentOfType(el, classOf[JSClassImpl]) 

打印如下:斯卡拉類型比較不工作

(false,class com.intellij.lang.javascript.psi.ecmal4.impl.JSClassImpl,class com.intellij.lang.javascript.psi.ecmal4.impl.JSClassImpl) 

不宜這些評估爲真?

目前的解決辦法是:

System.out.println(aClass.toString == element.getClass.toString) 

這似乎是荒謬的。我已經嘗試了一切!

,然後當我從方法返回一個Option(el.asInstanceOf[T]),我得到以下錯誤,每當我嘗試使用它:

java.lang.ClassCastException: com.intellij.lang.javascript.psi.ecmal4.impl.JSClassImpl cannot be cast to com.intellij.lang.javascript.psi.ecmal4.impl.JSClassImpl 

我有一種感覺它是與類加載器。

ClassCastException when casting to the same class

從的IntelliJ支持論壇:

你要注意,插件有自己的ClassLoader。

http://devnet.jetbrains.com/message/5259550;jsessionid=13C3F98277311F5EFFFAFD3135B42CEA

+1

的可能的複製http://stackoverflow.com/questions/9642859/scala -generic-abstract-type-ignored-for-isinstanceof –

+0

從沒有工作的問題嘗​​試了'System.out.println(manifest.erasure.isInstance(element))'。 – vaughan

回答

0

見問題記錄here

目前isInstanceOf/asInstanceOf不支持(上界) 類型參數,因此參數多態,即使 的是不可能的類型參數有一個清單。

+0

有沒有可以推薦的解決方法? – vaughan

+0

您是否閱讀過我鏈接的問題?解決方法在JIRA –

+0

中列出,試過'manifest.erasure.isInstance(element)'。試了一切。我現在正在考慮它的類加載器問題。我已經更新了這個問題。 – vaughan

0

哦成功。光榮的成功!

這種打字業務是轉移。

所以問題原來是IntelliJ爲每個插件使用不同的類加載器。

基本上我從一個不同的類加載器接收對象,這意味着所有的比較都會失敗。

回想起來,這在Java代碼中被破壞了,所以它不可能是Scala的錯。

謝謝大家誰回答,抱歉浪費你的時間,但我確實學到了很多類型標籤,艙單等:)