Ich durchlaufe ArrayList<Bar>
. Foo
erweitert Bar
. Ich versuche eine Instanz von Foo
in der Liste zu finden.
Wenn dieser Codeabschnitt ausgeführt wird, erhalte ich diesen Fehler:
%Vor% Allerdings habe ich an einer anderen Stelle eine Methode, die eine Instanz von Bar
zurückgibt, und ich kann überprüfen, ob es eine Instanz von Foo
mit instanceof
ist und dann Bar
auf Foo
mit keine Probleme:
Was ist hier anders?
Hier ist die wahre Ursache des Problems: Ссылка
Ich arbeite mit einer API namens Bukkit, die benutzerdefinierte Plugins für Server für ein Spiel namens Minecraft ermöglicht. Die Dokumentation finden Sie hier für diejenigen, die wirklich an dem Problem interessiert sind. Ich werde zu den offiziellen Bukkit-Foren gehen und dort meine Frage versuchen, da es sich mehr um ein API-spezifisches Problem handelt, aber ich werde all das hier für diejenigen lassen, die sich für das Problem interessieren.
Ich vermute, dass Sie Foo
von zwei Orten laden. Versuchen Sie in Ihrer Schleife, bar.getClass().getClassLoader()
und Foo.class.getClassLoader()
auszudrucken. Ich vermute, dass sie verschiedene Klassenlader zeigen werden. (Es ist möglich, dass Sie zwei Klassenlader haben, die von der gleichen Stelle geladen werden, was natürlich genauso schlecht ist.)
Was die JVM betrifft, so unterscheiden sich zwei Klassen mit demselben Namen, die von verschiedenen Klassenladern geladen wurden, grundlegend voneinander - Sie können nicht von einem zum anderen springen. Wenn ich recht habe, ist die übliche Lösung, zu versuchen, warum sie von verschiedenen Klassenladern geladen werden, und das zu beheben.
Beachten Sie, dass bei der Verwendung von instanceof
überprüft wird, ob die Typen wirklich kompatibel sind, sodass die verschiedenen Klassenlader bemerken wird.