【问题标题】:gradle: fileCollection.plus() returns ArrayList contradicting interfacegradle:fileCollection.plus() 返回 ArrayList 矛盾的接口
【发布时间】:2020-12-10 13:22:45
【问题描述】:

gradle: fileCollection.plus() 返回 ArrayList 矛盾接口。

def foo = files([]);  // foo: gradle FileCollection
println foo.class
foo = foo.plus(sourceSets.main.java.srcDirs);    // foo: java.util.ArrayList
println foo.class

但它应该返回一个 FileCollection:

https://docs.gradle.org/current/javadoc/org/gradle/api/file/FileCollection.html#plus-org.gradle.api.file.FileCollection-

【问题讨论】:

    标签: java gradle


    【解决方案1】:

    plus 方法重载了,你看错了。

    您链接到的 FileCollection.plus 的 API 具有签名:

    FileCollection plus​(FileCollection 集合)

    返回一个 FileCollection,它包含这个集合和给定集合的联合。返回的集合是实时的,并跟踪两个源集合的更改。

    但是您将 ArrayList 作为参数传递。 ArrayList 不是 FileCollection

    但是,FileCollection 也是 Iterable,因此您真正调用的是具有此签名的标准 Groovy 方法 Interable.plus

    public Collection plus(可迭代权)

    创建一个集合作为两个迭代的联合。如果左迭代是一个集合,那么返回的集合将是一个集合,否则一个列表。此操作将始终为结果创建一个新对象,而操作数保持不变。

    因为“左”迭代不是Set(它是FileCollection),所以你会得到一个List,而Groovy 恰好在实现中使用了ArrayList

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-30
      • 2015-11-15
      • 1970-01-01
      • 2011-02-03
      • 1970-01-01
      • 2017-11-06
      • 2016-02-21
      • 1970-01-01
      相关资源
      最近更新 更多