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
答案 0 :(得分:0)
查看记录的问题here
目前isInstanceOf / asInstanceOf不支持(上限) 类型参数因此即使参数多态也不可能 type参数有一个清单。
答案 1 :(得分:0)
哦成功。光荣的成功!
这种打字业务是一种转移。
因此,问题结果是IntelliJ对每个插件使用了单独的类加载器。
基本上我从不同的类加载器接收对象,这意味着所有的比较都会失败。
回想起来,这在Java代码中被破坏了,所以它永远不会是Scala的错。
感谢所有回答的人,很抱歉浪费你的时间,但我确实学到了很多关于TypeTag,Manifest等的知识。)