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])从该方法返回 a 时,每当我尝试使用它时都会收到以下错误:

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

我觉得它与类加载器有关。

转换为同一类时出现 ClassCastException

来自 IntelliJ 支持论坛:

您应该注意插件有自己的 ClassLoader。

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

4

2 回答 2

0

请参阅此处记录的问题

目前 isInstanceOf/asInstanceOf 不支持(上限)类型参数,因此即使类型参数有清单,参数多态也是不可能的。

于 2013-06-25T16:46:58.597 回答
0

哦成功。光荣的成功!

这种打字业务是一种消遣。

所以问题出在 IntelliJ 为每个插件使用单独的类加载器。

基本上我是从不同的类加载器接收对象,这意味着所有的比较都会失败。

回想起来,这在 Java 代码中被破坏了,所以这绝不是 Scala 的错。

感谢所有回答的人,很抱歉浪费您的时间,但我确实学到了很多关于 TypeTags、Manifests 等的知识。:)

于 2013-06-25T17:44:00.937 回答