如何在一行中初始化集合?

时间:2017-01-13 20:56:15

标签: java list collections

我正在创建这样的列表并传递给方法withInitialListeners,然后我没有看到任何编译错误,它工作正常。

List<Host.StateListener> cassListener = new ArrayList<>(); // line 1
cassListener.add(new CassListener()); // // line 2

Builder clusterBuilder = Cluster.builder();
Cluster cluster =
        clusterBuilder
            .withInitialListeners(cassListener).build();

现在我想将line1和line2放在一行并将其直接传递给withInitialListeners方法,所以我做了类似的事情:

Builder clusterBuilder = Cluster.builder();
cluster =
    clusterBuilder
        .withInitialListeners(Arrays.asList(new CassListener())).build();

但是使用这种方法它会给我编译错误,如下所示:

The method withInitialListeners(Collection<Host.StateListener>) in the type Cluster.Builder is not applicable for the arguments (List<CassListener>)

有什么问题,我该如何解决?我正在使用Java 7。

2 个答案:

答案 0 :(得分:1)

理想情况下,您应该将withInitialListeners的签名更改为withInitialListeners(Collection<? extends Host.StateListener>)

如果这不是一个选项,您可以通过在方法调用之前在< ... >中放置显式类型来强制方法的泛型类型:

Arrays.<Host.StateListener>asList(new CassListener())

正如您所看到的,写作非常奇怪,可能会让未来的开发人员不得不维护它。第一种选择是首选。但有时候,明确的通用打字是不可避免的。

答案 1 :(得分:-1)

Builder clusterBuilder = Cluster.builder();
Cluster cluster =
    clusterBuilder
        .withInitialListeners(Arrays.asList(new CassListener())).build();