在Java中转换类型

时间:2010-10-08 07:52:11

标签: java iterator types generics

Java noob here,

我想要Iterator<TypeA>转换为Iterator<TypeB>。 TypeA和TypeB不能直接相互转换,但我可以写一个规则如何转换它们。我怎么能做到这一点?我应该扩展并覆盖Iterator<TypeA>下一个,hasNext和删除方法吗?

感谢。

6 个答案:

答案 0 :(得分:15)

您不需要自己编写。 Guava(以前的Google收藏)让您了解Iterators.transform(...)

你提供了你的迭代器和一个将TypeA转换为TypeB的函数,你已经完成了。

Iterator<TypeA> iterA = ....;
Iterator<TypeB> iterB = Iterators.transform(iterA, new Function<TypeA, TypeB>() {
   @Override
   public TypeB apply(TypeA input) {
     TypeB output = ...;// rules to create TypeB from TypeA
     return output;
   }
});

答案 1 :(得分:7)

写一个adapter。这是Java中的an example。 OReilly的书'Head First: Design Patterns'给出了关于该主题的最佳解释。

答案 2 :(得分:4)

我猜你应该用方法中的((转换))规则编写自己的迭代器(它可以实现java.util.iterator)并使用它。

答案 3 :(得分:2)

您可以使用以下代码段:

public static void main(String... args){
    Iterator<TypeA> iteratorTypeA = methodToGetIteratorTypeA();
    Iterator<TypeB> iteratorTypeB = new IteratorConveter<TypeA, TypeB>(iteratorTypeA,
        new Converter<TypeA, TypeB>(){
            public TypeB convert(TypeA typeA){
                return null; //Something to convert typeA to type B
            }
        });
}

public class IteratorConveter<F, T> implements Iterator<T> {
    private final Converter<? super F, ? extends T> converter;
    private final Iterator<F> iterator;

    public IteratorConveter(Iterator<F> iterator, Converter<? super F, ? extends T> converter) {
        this.converter = converter;
        this.iterator = iterator;
    }

    public boolean hasNext() {
        return iterator.hasNext();
    }

    public T next() {
        return converter.convert(iterator.next());
    }

    public void remove() {
        iterator.remove();
    }
}


interface Converter<F, T> {
    T convert(F object);
}

答案 4 :(得分:1)

由于Java中的Generics只是一个编译时构造,我觉得你最好不要在调用next()时转换你检索的每个元素,而不是强制转换迭代器。

答案 5 :(得分:1)

拥有一个他们共享的超类可能是一个好主意,但这取决于这两种类型的确切定义,或者甚至可能有一种继承自另一种,因为它们似乎是两种表示形式对于相同的数据。这也可以解决你的迭代器问题。

或者您可以编写一个容器,该容器在内部使用其中一个进行数据访问,并且对外部世界具有流畅的表示。我指的是“构图而不是继承”。

但从本质上讲,这一切都归结为:你是否认真思考过你的班级结构?你确定它尽可能好吗?