寻求自动铸造的解释

时间:2009-07-15 21:47:37

标签: java exception

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

我或多或少地要求从枚举到字符串的这种看似随机演员的潜在原因,而不是“请为我修改我的代码”

问题的要点如下:

我有一个界面,称之为IFoo,在此界面中,它有一个静态枚举,名为Bar

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

  Bar doGetBar();
}

我当然有一个实现Foo的{​​{1}}类。

IFoo

在其他地方,我有一个名为

的对象数组
public class Foo implements IFoo{
  public Bar getBar(){
    return Bar.A; // for example
  }
}

一个帮助方法返回一个Object[] result; s数组,保存Object方法的结果,称之为

getBar()

现在,当我做

public Object[] getBars()

result = getBars(); 神奇地拥有result而不是String s,字符串的值是外部类的实现类(实际上不是外部类,更多是包装类) ?Bar,即“Foo”。

有人可能会向我解释这是怎么回事吗?

一些线索: 1.结果在作业前持有字符串。 2. IFoo中的静态枚举是有问题的,它是非静态的,但当我试图将它从Foo.Bar(或沿着这些行的东西)转换为IFoo.Bar时,它会导致Bar

4 个答案:

答案 0 :(得分:3)

您的Object[]已加入String因为您将它们放在那里。如果您发布一小段示例代码,清楚地表明您已将Bar放入String但我会非常惊讶。

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

答案 1 :(得分:2)

使用集合和泛型代替类型安全。

编辑现在问题已变为概念级别,我将使用我的远程知识找出原因。

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

Object[] objs = Bar.values();
//...
objs = "A B C".split("\\s+");
//...
return objs;

这种代码因为Java中的数组是协变的(例如String []是Object []的子类)。以这种方式重用基类对象数组很麻烦。

答案 2 :(得分:2)

目前尚不清楚getBars()方法中包含什么“魔法”,如果没有更多信息,则无法生成示例实现来验证此行为。具体来说,不清楚“返回一个Object数组的辅助方法,保存getBar()方法的结果”意味着什么。

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

如果您真的无法生成简化的方案来向我们展示,那么我们的帮助能力将受到严格限制,因为getBar()方法是填充Object[]的地方。在这种情况下,如果你不能解决这个问题,那么我建议你可以向一位知识渊博的同事寻求一些帮助 - 可能是第二组眼睛会发现它。

答案 3 :(得分:0)

我假设你的getBars()方法看起来像这样:

     public Object[] getBars() {
     return Bar.values();
 }

如果您想知道应该从'Bar.values()'方法接收什么,请查看the JavaDoc。在您的情况下,values()会返回FooI$Bar类型。

不仅可以发布抛出异常的代码,也可以发布ClassCastException。