gpt4 book ai didi

java - Foo 不能转换为 Foo

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:33:50 25 4
gpt4 key购买 nike

我正在遍历 ArrayList<Bar> . Foo延伸Bar .我正在尝试查找 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然后投BarFoo没有问题:

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

我正在使用一个名为 Bukkit 的 API,它允许为名为 Minecraft 的游戏的服务器定制插件。可以找到文档 here对于那些真正对这个问题感兴趣的人。我将前往官方 Bukkit 论坛并在那里尝试我的问题,因为它越来越成为一个特定于 API 的问题,但我将把所有这些留给那些对该问题感兴趣的人。

最佳答案

我的猜测是您从两个地方加载 Foo。在您的循环中,尝试打印出 bar.getClass().getClassLoader()Foo.class.getClassLoader()。我怀疑他们会展示不同的类加载器。 (当然,您可能有两个类加载器从同一个地方加载,这同样糟糕。)

基本上,就 JVM 而言,从不同类加载器加载的两个同名类是完全不同的 - 您不能从一个类转换为另一个类。假设我对此是正确的,通常的解决方案是尝试找出为什么它们是从不同的类加载器加载的,并修复它。

请注意,当您改用 instanceof 时,它会检查类型是否真正兼容,因此它注意到不同的类加载器。

关于java - Foo 不能转换为 Foo,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9858289/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com