Scala类型比较不起作用

时间:2013-06-25 16:41:55

标签: scala

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

2 个答案:

答案 0 :(得分:0)

查看记录的问题here

  

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

答案 1 :(得分:0)

哦成功。光荣的成功!

这种打字业务是一种转移。

因此,问题结果是IntelliJ对每个插件使用了单独的类加载器。

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

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

感谢所有回答的人,很抱歉浪费你的时间,但我确实学到了很多关于TypeTag,Manifest等的知识。)