Java 寻求对自动铸造的解释

Java 寻求对自动铸造的解释,java,exception,Java,Exception,所以我花了大约一个小时试图揭开并解决一个非常奇怪的bug,一个我以前从未见过的bug 我多多少少是在询问从枚举到字符串的随机转换的潜在原因,而不是“请为我修复代码” 问题的要点如下: 我有一个接口,叫做IFoo,在这个接口中,它有一个静态枚举,叫做Bar: public interface IFoo { static enum Bar{ A, B, C, } Bar doGetBar(); } 我当然有一个Foo类,它实现了IFoo public clas

所以我花了大约一个小时试图揭开并解决一个非常奇怪的bug,一个我以前从未见过的bug

我多多少少是在询问从枚举到字符串的随机转换的潜在原因,而不是“请为我修复代码”

问题的要点如下:

我有一个接口,叫做
IFoo
,在这个接口中,它有一个静态枚举,叫做
Bar

public interface IFoo {
  static enum Bar{
    A,
    B,
    C,
  }

  Bar doGetBar();
}
我当然有一个
Foo
类,它实现了
IFoo

public class Foo implements IFoo{
  public Bar getBar(){
    return Bar.A; // for example
  }
}
在其他地方,我有一个名为

Object[] result;
以及一个helper方法,它返回一个
对象
s数组,保存来自
getBar()
方法的结果,调用它

public Object[] getBars()
现在,当我

result = getBars();
result
神奇地保存
String
s而不是
Bar
s,字符串的值是
Bar
的外部类(不是真正的外部类,更多的是包装类?)的实现类,即“Foo”

有人能给我解释一下这是怎么可能的吗

一些线索: 1.在分配任务之前,结果起着决定性的作用。
2.IFoo中的静态枚举是有问题的,它是非静态的,但当我试图从Foo.Bar(或类似的内容)将其强制转换为IFoo.Bar时,它导致了
ClassCastException
s。

您的
对象[]
中包含
字符串,因为您将它们放在了那里。如果您发布一个小的代码示例,清楚地说明您将
s放入,但将
字符串
s取出,我会非常惊讶


解决此类错误的方法是从头开始,制作一个简单的工作示例(可能不会显示错误)。然后继续添加代码,使其更像真实世界的应用程序,直到bug抬头。然后,您就可以将最近的更改识别为错误的来源。

使用集合和泛型来实现类型安全

编辑由于现在问题变成了概念层面,我将用我的遥感来找出原因

似乎您正在为完全不同的目的重用第252行上的Object[]数组。编译器接受

Object[] objs = Bar.values();
//...
objs = "A B C".split("\\s+");
//...
return objs;
这类代码是因为Java中的数组是协变的(例如String[]是Object[]的子类)。以这种方式重用基类对象数组很麻烦。

不清楚
getbar()
方法中包含了什么“魔力”,如果没有更多信息,就不可能生成一个示例实现来验证这种行为。具体地说,还不清楚“一个返回对象数组的helper方法,保存getBar()方法的结果”是什么意思

如果可以,按照建议隔离包含行为的最小测试用例。oxbow_lakes的建议也很好;进行尽可能接近真实行为的简单测试


如果您真的无法生成一个简化的场景来向我们展示,那么我们帮助您的能力将受到严重限制,因为
getBar()
方法是填充
对象[]
的地方。在这种情况下,如果您无法解决此问题,那么我建议您可能需要向知识更丰富的同事寻求帮助-可能是第二双眼睛会发现它。

我假设您的
getbar()
方法如下所示:

     public Object[] getBars() {
     return Bar.values();
 }
如果您想知道应该从“Bar.values()”方法接收什么,请签出。在您的情况下,
values()
将返回类型
FooI$Bar


发布可能会很有用,不仅是您编写的引发异常的代码,还有ClassCastException。

您需要发布一段实际工作的代码,如果我做不到,我们可以查看它,我应该关闭线程吗?为什么这是不可能的?我不是要求你复制整个代码库:-)只需编写一个像上面那样的小程序来演示bug,并且只演示bug。毕竟,您似乎在问“我编写的某些代码中有一个bug,但无法向您展示”。任何人都应该如何帮助解决这个问题?通过查看完全不同(且不一致)的代码来诊断问题是不可能的,您认为这些代码包含了导致实际代码中出现这种奇怪行为的本质。发布实际的代码,或者尝试在一个最小的示例中重现问题-在构建该示例时,您可能会发现潜在的问题。好的,我查看了调试器,并在赋值后直接评估了右侧的输出。一个保存字符串对象,一个保存枚举。1) 您认为在调试器中看到的内容有误。2) 您认为在调试步骤中执行的代码是错误的。3) JVM有一个基本问题。在你的机器上。没有其他人。接受我的建议——你需要慢慢地、有条不紊地从头开始重新处理你的问题。我知道这很痛苦。但它将解决第一个问题:“为什么我不能将
ArrayList
分配给
List
?”?