Java:ClassCastException;相同的类加载器?

Java:ClassCastException;相同的类加载器?,java,classloader,classcastexception,bukkit,Java,Classloader,Classcastexception,Bukkit,我在铸造方面遇到了问题,我想不出来。根据我的研究,当你向你的类强制转换一个超类时,是什么导致了ClassCastException,原因是它们都使用不同的类装入器 我做了一个简单的System.out.println()来检查类加载器是否不同,但它们都打印出相同的结果,@11cb01a 为了达到我想要实现的目的,我正在尝试为自己创建一个简单的API来制作小游戏(我使用的是Bukkit API),我在两个位置发现了错误,一个是ClassCastException。首先,我有两个类,ArenaBas

我在铸造方面遇到了问题,我想不出来。根据我的研究,当你向你的类强制转换一个超类时,是什么导致了
ClassCastException
,原因是它们都使用不同的类装入器

我做了一个简单的
System.out.println()
来检查类加载器是否不同,但它们都打印出相同的结果,
@11cb01a

为了达到我想要实现的目的,我正在尝试为自己创建一个简单的API来制作小游戏(我使用的是Bukkit API),我在两个位置发现了错误,一个是
ClassCastException
。首先,我有两个类,
ArenaBase
arenamanagebase
。我有一个名为
ArenaManager
的类,它扩展了
arenamanagebase
,还有
Arena
扩展了
ArenaBase

当我为
aremanager
ClassCastException
获取错误时,它来自调用
aremanager.getInstance()
并将
(aremanager)
强制转换到它。当它第一次启动时,我初始化我的
arenamager

ArenaManager.init(this);
然后,在init内部,我调用了一些东西

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.
}
引发错误的部分如下所示:

ArenaManager am = (ArenaManager) ArenaManager.getInstance();
所以从这里开始,我有一个类,我正试图把它转换成另一个类的超类。它们似乎都有相同的
类加载器
。我做错了什么?我该如何修复它

编辑:
这是stacktrace。这很奇怪,因为它在顶部显示为
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

可以使用父类型变量引用子类的实例。但你不能做相反的事情。尽管您可以通过使用类似-
(ArenaManager)ArenaManager.getInstance()
的显式强制转换绕过编译器错误检查,但它最终会在运行时因CCE而失败


arenamanagebase
是您案例中的父项,
ArenaManager
是您案例中的子项。您拥有的实例是父实例(即
new arenamagerbase()
),您正试图将其强制转换为子实例。

您可以放置stacktrace吗?很抱歉,我添加了stacktrace。示例:
String extends Object
。但是您不能强制转换
(String)new Object()
。我不明白您指的是什么。我在
ArenaManagerBase
中有一个方法getInstance(),它返回一个
ArenaManagerBase
,并且
ArenaManager
扩展了
ArenaManagerBase
,因此,我不应该将
ArenaManagerBase
强制转换为
ArenaManagerBase
,这相当于@njzk2在评论中的内容。