Ищу объяснения для Auto-Casting - PullRequest
0 голосов
/ 16 июля 2009

Так что я потратил около часа, пытаясь раскрыть и устранить очень странную ошибку, которую я никогда раньше не видел.

Я более или менее спрашиваю о возможных причинах этого кажущегося случайного приведения из enum в String, а не "пожалуйста, исправьте мой код для меня" .

Суть проблемы заключается в следующем:

У меня есть интерфейс, назовите его 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;

И вспомогательный метод, который возвращает массив Object с, содержащий результаты метода getBar(), вызывает его

public Object[] getBars()

Теперь, когда я делаю

result = getBars();

result магически содержит String с вместо Bar с, значения строк являются классом реализации внешнего класса (на самом деле это не внешний класс, а скорее класс-обертка?) Bar т.е. "Foo".

Может ли кто-нибудь объяснить мне, как это возможно?

Некоторые выводы: 1. результаты держали строки перед назначением. 2. Статическое перечисление внутри IFoo сомнительно, оно было нестатичным, но оно вызвало ClassCastException s, когда я попытался привести его к IFoo.Bar из Foo.Bar (или что-то в этом роде).

Ответы [ 4 ]

3 голосов
/ 16 июля 2009

В вашем Object[] есть String с, потому что вы положили их туда . Если вы разместите небольшой пример кода, демонстрирующий, что вы положили Bar s, но получили String s, я буду очень удивлен.

Метод устранения ошибок, подобный этому, заключается в том, чтобы начать с самого начала, создав простой рабочий пример (который, вероятно, не будет отображать ошибку). Затем продолжайте добавлять код, чтобы сделать его более похожим на ваше реальное приложение, пока ошибка не возродится. Тогда вы сможете определить свое последнее изменение как источник ошибки.

2 голосов
/ 16 июля 2009

Непонятно, что за «волшебство» содержится в методе getBars(), и без дополнительной информации невозможно создать пример реализации для проверки этого поведения. В частности, неясно, что означает «вспомогательный метод, который возвращает массив объектов, содержащий результаты метода getBar ()».

Если можете, выделите наименьший контрольный пример, содержащий поведение, как предлагается. предложение oxbow_lakes тоже хорошо; приведите простой тест как можно ближе к реальному поведению.

Если вы действительно не можете создать упрощенный сценарий, чтобы показать нам, тогда наша способность помочь вам будет серьезно ограничена, поскольку в этом методе getBar() используется Object[]. В этом случае, если вы не можете решить эту проблему, я полагаю, вам, возможно, придется обратиться к более знающему коллеге за помощью - может быть, второй взгляд заметит это.

2 голосов
/ 16 июля 2009

Вместо этого используйте коллекции и дженерики для безопасности типов.

Редактировать Так как теперь вопрос изменился до концептуального уровня, я буду использовать свою телесность для определения причины.

Кажется, вы повторно используете массив Object [] в строке 252 для совершенно других целей. Компилятор принимает

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

этот вид кода, потому что массивы в Java ковариантны (например, String [] является подклассом Object []). Повторное использование массива объектов базового класса затруднительно.

0 голосов
/ 16 июля 2009

Я предполагаю, что ваш getBars() метод выглядит следующим образом:

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

если вам интересно, что вы должны получать от метода Bar.values ​​(), проверьте JavaDoc . В вашем случае values() вернет тип FooI$Bar.

Может быть полезно опубликовать не только собранный вами код, который выдает исключение, но и ClassCastException.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...