Foo kann nicht nach Foo gewirkt werden

8

Ich durchlaufe ArrayList<Bar> . Foo erweitert Bar . Ich versuche eine Instanz von Foo in der Liste zu finden.

%Vor%

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:

%Vor%

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.

    
Austin Moore 25.03.2012, 06:14
quelle

1 Antwort

17

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.

    
Jon Skeet 25.03.2012, 06:24
quelle

Tags und Links