简体   繁体   English

Java:ClassCastException; 相同的ClassLoader?

[英]Java: ClassCastException; Same ClassLoader?

I am having troubles with casting, and I cannot figure it out. 我在投放时遇到了麻烦,我无法弄清楚。 According to my research, what causes a ClassCastException when you cast a superclass to your class, the reason is they both use different Class Loaders. 根据我的研究,当您将超类强制转换为类时,导致ClassCastException的原因是它们都使用不同的类加载器。

I did a simple System.out.println() to check if the class loaders are different, but they both print out the same result, @11cb01a . 我做了一个简单的System.out.println()来检查类加载器是否不同,但是它们都打印出相同的结果@11cb01a

To get to the point on what I'm trying to accomplish, what I am attempting is creating a simple API for myself to make minigames with (I am using the Bukkit API) and I have found errors at two locations of having a ClassCastException . 为了弄清楚我要完成的工作,我正在尝试为自己创建一个简单的API来制作迷你游戏(我正在使用Bukkit API),并且在出现ClassCastException两个位置上发现了错误。 First off, I have two classes, the ArenaBase and ArenaManagerBase . 首先,我有两个类, ArenaBaseArenaManagerBase I have a class called ArenaManager that extends ArenaManagerBase , and Arena that extends ArenaBase . 我有一个名为ArenaManager的类,该类扩展了ArenaManagerBase ,一个Arena扩展了ArenaBase

When I get my error for a ClassCastException for ArenaManager , it's from calling ArenaManager.getInstance() and casting (ArenaManager) to it. 当我收到关于ArenaManagerClassCastExceptionArenaManager ,它是从调用ArenaManager.getInstance()并将其强制转换为(ArenaManager)引起的。 When it first starts, I initialize my ArenaManager . 第一次启动时,我会初始化ArenaManager

ArenaManager.init(this);

Then, inside of the init I call a few things. 然后,在初始化内部,我要说几件事。

public static void init(JavaPlugin instance) {
    am = new ArenaManagerBase(); // What is returned when calling getInstance()
    am.plugin = instance;
    am.ac = new ArenaConfigBase(am.plugin);
    am.init(); // Separate initializer for any subclass that might need it.
}

The part that throws the error is this: 引发错误的部分是这样的:

ArenaManager am = (ArenaManager) ArenaManager.getInstance();

So just from this, I have a class that I am trying to cast to that is a superclass of the other. 因此,仅此而已,我尝试将其强制转换为另一个类的超类。 They both seemingly have the same ClassLoader . 他们似乎都具有相同的ClassLoader What am I doing wrong, and how could I fix it? 我在做什么错,我该如何解决?

Edit: 编辑:
Here's the stacktrace. 这是堆栈跟踪。 It's weird, because at the top it says null and then at the bottom it contemplates a CastClassException . 这很奇怪,因为在顶部它表示null ,然后在底部它考虑了CastClassException

[18:36:10 ERROR]: null
org.bukkit.command.CommandException: Unhandled exception executing command 'cast
ledefend' in plugin DefendTheCastle vAlpha
        at org.bukkit.command.PluginCommand.execute(PluginCommand.java:46) ~[cra
ftbukkit.jar:git-Bukkit-1.7.2-R0.3-b3020jnks]
        at org.bukkit.command.SimpleCommandMap.dispatch(SimpleCommandMap.java:17
5) ~[craftbukkit.jar:git-Bukkit-1.7.2-R0.3-b3020jnks]
        at org.bukkit.craftbukkit.v1_7_R1.CraftServer.dispatchCommand(CraftServe
r.java:683) ~[craftbukkit.jar:git-Bukkit-1.7.2-R0.3-b3020jnks]
        at net.minecraft.server.v1_7_R1.PlayerConnection.handleCommand(PlayerCon
nection.java:952) [craftbukkit.jar:git-Bukkit-1.7.2-R0.3-b3020jnks]
        at net.minecraft.server.v1_7_R1.PlayerConnection.a(PlayerConnection.java
:814) [craftbukkit.jar:git-Bukkit-1.7.2-R0.3-b3020jnks]
        at net.minecraft.server.v1_7_R1.PacketPlayInChat.a(PacketPlayInChat.java
:28) [craftbukkit.jar:git-Bukkit-1.7.2-R0.3-b3020jnks]
        at net.minecraft.server.v1_7_R1.PacketPlayInChat.handle(PacketPlayInChat
.java:47) [craftbukkit.jar:git-Bukkit-1.7.2-R0.3-b3020jnks]
        at net.minecraft.server.v1_7_R1.NetworkManager.a(NetworkManager.java:146
) [craftbukkit.jar:git-Bukkit-1.7.2-R0.3-b3020jnks]
        at net.minecraft.server.v1_7_R1.ServerConnection.c(SourceFile:134) [craf
tbukkit.jar:git-Bukkit-1.7.2-R0.3-b3020jnks]
        at net.minecraft.server.v1_7_R1.MinecraftServer.u(MinecraftServer.java:6
55) [craftbukkit.jar:git-Bukkit-1.7.2-R0.3-b3020jnks]
        at net.minecraft.server.v1_7_R1.DedicatedServer.u(DedicatedServer.java:2
50) [craftbukkit.jar:git-Bukkit-1.7.2-R0.3-b3020jnks]
        at net.minecraft.server.v1_7_R1.MinecraftServer.t(MinecraftServer.java:5
45) [craftbukkit.jar:git-Bukkit-1.7.2-R0.3-b3020jnks]
        at net.minecraft.server.v1_7_R1.MinecraftServer.run(MinecraftServer.java
:457) [craftbukkit.jar:git-Bukkit-1.7.2-R0.3-b3020jnks]
        at net.minecraft.server.v1_7_R1.ThreadServerApplication.run(SourceFile:6
17) [craftbukkit.jar:git-Bukkit-1.7.2-R0.3-b3020jnks]
Caused by: java.lang.ClassCastException: me.codermusgrove.arenaapi.ArenaManagerB
ase cannot be cast to me.valdeon.defendthecastle.arena.ArenaManager
        at me.valdeon.defendthecastle.cmd.CmdCreateArena.onCommand(CmdCreateAren
a.java:27) ~[?:?]
        at me.valdeon.defendthecastle.cmd.BaseCommand.onCommand(BaseCommand.java
:30) ~[?:?]
        at org.bukkit.command.PluginCommand.execute(PluginCommand.java:44) ~[cra
ftbukkit.jar:git-Bukkit-1.7.2-R0.3-b3020jnks]
        ... 13 more

An instance of a child class can be referred to using a parent type variable. 可以使用父类型变量来引用子类的实例。 But you cannot do the reverse. 但是你不能做相反的事情。 Although, you can bypass the compiler error checking by having an explicit cast like - (ArenaManager) ArenaManager.getInstance() , it will eventually fail at runtime with a CCE. 虽然,您可以通过使用- (ArenaManager) ArenaManager.getInstance()进行显式转换来绕过编译器错误检查,但最终它将在运行时由于CCE而失败。

ArenaManagerBase is the parent and ArenaManager is the child in your case. ArenaManagerBase是家长和ArenaManager你的情况的孩子。 The instance that you have is of the parent (ie new ArenaManagerBase() ), and you are trying to cast it the child. 您拥有的实例是父实例(即new ArenaManagerBase() ),并且您正在尝试将其new ArenaManagerBase()为子实例。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM