Если вы не против создания начального массива правильного типа, вы можете использовать jsni вместе с некоторыми знаниями о супер-супер-источнике для создания массивов БЕЗ копирования через ArrayList (я избегаю издержек java.util, таких как чума):
public static native <T> T[] newArray(T[] seed, int length)
/*-{
return @com.google.gwt.lang.Array::createFrom([Ljava/lang/Object;I)(seed, length);
}-*/;
Где seed - массив нулевой длины нужного вам типа, а length - желаемая длина (хотя в производственном режиме массивы на самом деле не имеют верхних границ, это заставляет поле [] .length работать правильно).
Пакет com.google.gwt.lang представляет собой набор основных утилит, используемых в компиляторе для базовой эмуляции, и находится в gwt-dev! Com / google / gwt / dev / jjs / intrinsic / com / google /gwt/lang.
Вы можете использовать эти классы только через вызовы jsni и только в производственном коде gwt (используйте if GWT.isProdMode ()). В общем, если вы обращаетесь только к классам com.google.gwt.lang в супер-исходном коде, вы гарантированно никогда не потеряете ссылки на классы, которые существуют только в скомпилированном javascript.
if (GWT.isProdMode()){
return newArray(seed, length);
}else{
return Array.newInstance(seed.getComponentType(), length);
}
Обратите внимание, что вам, вероятно, потребуется супер-исходный код класса java.lang.reflect.Array, чтобы избежать ошибки компилятора gwt, из-за чего вы захотите поместить туда свой собственный вспомогательный метод. Тем не менее, я не могу помочь вам больше, чем это, поскольку это вышло бы за рамки моего трудового договора.