Как лучше всего преобразовать набор объектов Java в другой набор объектов? - PullRequest
2 голосов
/ 30 апреля 2010

Базовый вопрос Java здесь от настоящего новичка. У меня есть набор объектов Java (класса "MyClass"), которые реализуют определенный интерфейс (интерфейс "MyIfc"). У меня есть набор этих объектов, хранящихся в закрытой переменной в моем классе, которая объявлена ​​следующим образом:

protected Set<MyClass> stuff = new HashSet<MyClass>();

Мне нужно предоставить открытый метод, который возвращает этот набор как коллекцию объектов типа "MyIfc".

public Collection<MyIfc> getMyStuff() {...}

Как мне сделать конвертацию? Следующая строка дает мне ошибку, что он не может сделать преобразование. Я бы предположил, что компилятор знал, что объекты класса MyClass реализовали MyIfc и, следовательно, обрабатывали бы его.

Collection<MyIfc> newstuff = stuff;

Любое просветление ценится.

Ответы [ 4 ]

6 голосов
/ 30 апреля 2010

Наверное, самый правильный путь:

    return new HashSet<MyIfc>(stuff);

Если класс слишком велик, чтобы сделать это, вы можете сделать:

    return Collections.unmodifiableSet(stuff);
3 голосов
/ 30 апреля 2010

Компилятору не нравится ваше присвоение материала newstuff, поскольку он открывает возможность помещать вещи в newstuff, которые реализуют MyIfc, но не имеют тип MyClass. Вы можете заставить свой геттер создать свою собственную коллекцию:

public Collection<MyIfc> getMyStuff() {
    Collection<MyIfc> coll = new HashSet<MyIfc>();
    coll.addAll(myStuff);
    return coll;
}
1 голос
/ 30 апреля 2010

Вам не нужно делать никаких преобразований. Вам придется набрать stuff как Set<MyIfc>.

Справочная информация: Да, правильно, если у вас есть объект типа MyClass, он также будет использоваться как экземпляр MyIfc. Но вы явно набрали свой Set типа MyClass. И это просто нечто отличное от набора типа MyIfc. В конце концов, у вас также могут быть другие классы, которые реализуют MyIfc, а затем вы можете также поместить их в ваш Set<MyIfc>, но не в Set<MyClass>.

0 голосов
/ 30 апреля 2010

Коллекции Google определяют набор ленивых адаптеров, которые могут подойти для ваших целей.

Одним из них является Collections2.transform . Вот пример того, как адаптировать вашу коллекцию:

Collection<MyIfc> newStuff =
  Collections2.transform(
    stuff,
    new Function<MyClass, MyIfc>( )
    {
      public MyIfc apply ( final MyClass from )
      {
        return (MyIfc) from; // This may throw a ClassCastException though
      }
    }
  )
...