3

Type の配列がありB[]ます。私はコンストラクターを持っていA(B b)ます。

それらを使用して Type で配列を作成したいと思いA[]ます。

forステートメントを使用してそれを行うことができますが、これを行うためのより便利な(より短い)方法があるかどうかを知りたいです。(言語構文、静的メソッドなど)

public class A {
    public A(B b) {
        A.a = B.a;
        A.b = B.b * B.c;
        ...
    }
}

public class B {
    ...
}

public class C {
    public static B[] getBs() {
        B[] bs;
        ...
        return bs;
    }
}

void process() {
    // From here
    B[] bs = C.getBs();
    A[] as = new A[bs.length];
    for (int i=0; i<bs.length; i++) {
        as[i] = new A(bs[i]);
    }
    // To here
}
4

3 に答える 3

4

言語の現在の1状態2の時点で、あなたができる最善のことは、次のようなものです3 :

interface Transformer<A, B> {
    B transform(A a);
}

class ArrayUtils {
    @SuppressWarnings("unchecked")
    public static <A, B> B[] transformArray(
        Class<B> clazz,
        A[] a,
        Transformer<A, B> transformer
    ) {
        B[] b = (B[])Array.newInstance(clazz, a.length);
        for(int i = 0; i < a.length; i++) {
            b[i] = transformer.transform(a[i]);
        }
        return b;
    }
}

使用法:

Foo[] foos = // some Foo array
Bar[] bars = 
    ArrayUtils.transformArray(
        Bar.class,
        foos,
        new Transformer<Foo, Bar>() {
            public Bar transform(Foo foo) { return new Bar(foo); } 
        }
    );

これは、次のことを前提としています。

class Foo { }
class Bar { public Bar(Foo foo) { } }

1 : 2014 年 (?) には、より簡単にする機能が追加されます。

2 :皆さん、覚えておいてください。次に独自の型システムをゼロから設計するときは、後から追加するのではなく、早い段階でジェネリックを追加することを忘れないでください

3 : これを一緒にハッキングしました。バグの修正にご協力ください。:-)

于 2013-08-09T03:55:33.240 に答える
1

Java 7 の時点で、可能な限り最短のループを既に使用しています。

for (int i = 0; i < bs.length; ++i) {
    as[i] = new A(bs[i]);
}

ただし、配列の代わりにコレクションを使用する場合は、「for each」を使用できます。

for (B b: bs) {
    as.add(new A(b));
}

コレクションは、他の柔軟性とショートカットも提供します。

于 2013-08-09T04:19:54.413 に答える