Я перебираю 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 проблемой, но я оставлю все это здесь для тех, кто был заинтересован в проблеме.