Foo не может быть приведен к Foo - PullRequest
8 голосов
/ 25 марта 2012

Я перебираю ArrayList<Bar>.Foo расширяется Bar.Я пытаюсь найти экземпляр Foo в списке.

ArrayList<Bar> list = new ArrayList<Bar>();

// fill list with items that are instances of Foo and Bar

for (int i = 0; i < list.size(); i++)
{
  Bar bar = list.get(i);

  if (bar.getClass().getName().equals("com.me.Foo")) // "if(bar instanceof Foo)" never passes
  {
    System.out.println("bar is an instance of Foo");
    Foo foo = (Foo) bar;
  }
}

Если этот раздел кода запускается, я получаю эту ошибку:

java.lang.ClassCastException: com.me.Foo cannot be cast to com.me.Foo
// stack

Однако в другомспот, у меня есть метод, который возвращает экземпляр Bar, и я могу проверить, является ли он экземпляром Foo, используя instanceof, а затем привести Bar к Foo без проблем:

Bar bar = returnBar(); // returns an instance of Bar, but the variable 
                       // it returns could be an instance of Foo
if (bar instanceof Foo)
{
  System.out.println("bar is an instance of Foo");
  Foo foo = (Foo) bar;
}

Что здесь отличается?

Вот реальный источник проблемы: http://pastie.org/private/jhyhovn7mm4ghxlxsmweog

Я работаю с API под названием Bukkit, который позволяет создавать собственные плагины для серверов дляигра под названием Minecraft.Документация может быть найдена здесь для тех, кто действительно заинтересован в проблеме.Я собираюсь пойти на официальные форумы Bukkit и попробовать свой вопрос там, поскольку это становится все более специфичной для API проблемой, но я оставлю все это здесь для тех, кто был заинтересован в проблеме.

1 Ответ

17 голосов
/ 25 марта 2012

Я предполагаю, что вы загружаете Foo из двух мест.В вашем цикле попробуйте распечатать bar.getClass().getClassLoader() и Foo.class.getClassLoader().Я подозреваю, что они покажут разные загрузчики классов.(Возможно, что у вас есть два загрузчика классов, загружающихся из одного места, конечно, что одинаково плохо.)

В принципе, что касается JVM, два класса с одинаковым именем загружаются из разныхЗагрузчики классов совершенно разные - вы не можете бросать от одного к другому.Предполагая, что я прав в этом, обычное решение состоит в том, чтобы попытаться выяснить почему они загружаются из разных загрузчиков классов, и исправить это.

Обратите внимание, что когда вы используете instanceof вместо этого он проверяет, действительно ли типы совместимы, поэтому будет замечать различные загрузчики классов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...