【问题标题】:Am I missing something, or do varargs break Arrays.asList?我是否遗漏了什么,或者 varargs 是否会破坏 Arrays.asList?
【发布时间】:2010-09-22 02:30:41
【问题描述】:
  private void activateRecords(long[] stuff) {
    ...
    api.activateRecords(Arrays.asList(specIdsToActivate));
  }

这个对 Arrays.asList 的调用不应该返回Longs 的列表吗?相反,它返回一个List<long[]>

public static <T> List<T> asList(T... a)

方法签名与结果一致,可变参数将整个数组扔到列表中。它与new ArrayList(); list.add(myArray) 相同,是的,我知道它应该像这样使用:Arrays.asList(T t1, T t2, T t3)

我想我得到的是什么,而不是可变参数形式,为什么我不能只使用我的旧 asList 方法(至少我认为这是它过去的工作方式),它将获取内容并放入他们单独成一个列表?还有其他干净的方法吗?

【问题讨论】:

    标签: java generics variadic-functions


    【解决方案1】:

    那是因为 long[] 和 Long[] 是不同的类型。

    在第一种情况下,T 是 long[],在第二种情况下,T 是 Long。

    如何解决这个问题?首先不要使用 long[] 吗?

    【讨论】:

    • 谢谢!我现在明白了,但使用供应商遗留应用程序并没有让我选择“[not] use long[] in place”
    • "无法从 long[] 转换为 Long[]"
    • 是的,您需要一次完成一个元素才能启动自动装箱
    【解决方案2】:

    无法对数组进行自动装箱。你可以这样做:

    private List<Long> array(final long[] lngs) {
        List<Long> list = new ArrayList<Long>();
        for (long l : lngs) {
            list.add(l);
        }
        return list;
    }
    

    private List<Long> array(final long[] lngs) {
        List<Long> list = new ArrayList<Long>();
        for (Long l : lngs) {
            list.add(l);
        }
        return list;
    }
    

    (注意可迭代类型不同)

    例如

    Long l = 1l;
    

    但不是

    Long[] ls = new long[]{1l}
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-03-23
      • 2023-02-03
      • 2023-03-17
      • 1970-01-01
      • 2020-10-20
      • 2021-02-24
      • 1970-01-01
      相关资源
      最近更新 更多