不,你必须使用循环。
Tile[] tiles = new Tile[20];
for(int i = 0; i < tiles.length; i++) {
tiles[i] = new Tile(5, 5);
}
不过,很高兴在 Java 8 中我们可以使用新的 Supplier 类和辅助方法来缩短它。
static <E> E[] fill(E[] arr, Supplier<? extends E> supp) {
for(int i = 0; i < arr.length; i++) {
arr[i] = supp.get();
}
return arr;
}
然后我们可以执行以下操作:
Tile[] tiles = fill(new Tile[20], () -> new Tile(5, 5));
我觉得这很漂亮。
还有几种方法可以在没有 Java 8 的情况下使用反射来实现这一点。如果类有一个复制构造函数(一个将自己类的对象作为参数的构造函数),这是一种方法:
static <E> E[] duplicate(E[] arr, E element) {
@SuppressWarnings("unchecked")
Class<? extends E> cls = (Class<? extends E>)element.getClass();
try {
Constructor<? extends E> ctor = cls.getConstructor(cls);
for(int i = 0; i < arr.length; i++) {
arr[i] = ctor.newInstance(element);
}
} catch(Exception e) {
e.printStackTrace(System.err);
}
return arr;
}
例如:
String[] arr = fill(new String[5], "Hello world!");
Reflection 比 lambda 更不稳定,尤其是在处理子类型和基元时。 lambda 很棒。