Я перебираю ArrayList<Bar>
. Foo
распространяется Bar
. Я пытаюсь найти экземпляр Foo
в списке.Foo нельзя отнести к 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. Документация может быть найдена here для тех, кто действительно интересуется этой проблемой. Я собираюсь пойти на официальные форумы Bukkit и попробовать свой вопрос там, так как он становится больше проблемой API, но я оставлю все это здесь для тех, кто интересуется этой проблемой.
Они оба наследуют от того же базового слоя? – Asdfg
@Asdfg * Они * были чем? –
не могли бы вы предоставить демо-версию IDEOne для своей проблемы? http://ideone.com –