Объедините неизменный список гуавы и varargs - PullRequest
9 голосов
/ 25 декабря 2010

Я хочу создать конструктор, который возьмет одно или несколько целых чисел и сохранит его в поле как ImmutableList.В соответствии с «Правильным способом использования varargs для передачи одного или нескольких аргументов» из статьи 42 Блоха, я создаю smt как

class Foo{
    private final ImmutableList<Integer> bar;
    public Foo(Integer first, Integer... other) {
        this.bar = ImmutableList.<Integer>builder()
                .add(first)
                .addAll(Arrays.asList(other))
                .build();
    }
}

Почему строитель не получает универсальный автоматически?И, как пахнет.Как я могу переписать это?

upd qasting с дженериками решен.Любые предложения по рефакторингу очень полезны.

Ответы [ 2 ]

14 голосов
/ 25 декабря 2010

Поскольку при вызове builder() нет левой части выражения.Компилятор не может определить, какой тип добавить туда.(Это не может быть выведено из последующих вызовов методов)

Если вы измените его на следующее, оно будет работать:

Builder<Integer> builder = ImmutableList.builder();
this.bar = builder.add(first).addAll(Arrays.asList(other)).build();

Однако вы можете безопасно сохранить текущий код - это нормально.И даже лучше, чем в приведенном выше примере (он короче)

О рефакторинге - почему бы не использовать .add(first).add(other)?Метод add имеет версию varargs.

8 голосов
/ 26 декабря 2010

Относительно вашего второго вопроса (как реорганизовать ваш конструктор, чтобы он был короче / более читабельным), я бы сделал следующее:

class Foo{
    private final ImmutableList<Integer> bar;
    public Foo(Integer first, Integer... other) {
        this.bar = ImmutableList.copyOf(Lists.asList(first, other));
    }
}

Оба Lists.asList методы были разработаны сэта цель в соответствии с их javadoc:

Это полезно, когда метод varargs должен использовать сигнатуру, такую ​​как (Foo firstFoo, Foo ... moreFoos), чтобы избежать неоднозначности перегрузкиили для обеспечения минимального количества аргументов.

Он также более производительный, чем ImmutableList.Builder, поскольку он позволяет избежать создания / изменения размера временного ArrayList внутри Builder.


...