2013-06-25 2 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]) 

Печатает следующие:Scala сравнение типа не работает

(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 не поддерживают (ограничена сверху) параметры типа, так что параметрический полиморфизм не представляется возможным, даже если в type имеет манифест.

+0

Есть ли обходной путь, который вы могли бы порекомендовать? – vaughan

+0

Вы прочитали вопрос, который я связал? Обходные пути перечислены в JIRA –

+0

Да, проверено 'manifest.erasure.isInstance (element)'. Пробовал все. Сейчас я думаю о проблеме с загрузчиком класса. Я обновил вопрос. – vaughan

0

О, успех. Славный успех!

Этот типичный бизнес был утечкой.

Таким образом, проблема оказалась в использовании IntelliJ отдельными загрузчиками классов для каждого плагина.

В основном я получал объекты от другого загрузчика классов, что означало бы, что все сравнения потерпят неудачу.

В ретроспективе это было нарушено в Java-коде, поэтому никогда не могло быть ошибкой Scala.

Спасибо всем, кто ответил, жаль тратить свое время, но я много узнать о TypeTags, манифестов и т.д. :)

Смежные вопросы