gradle:fileCollection.plus()はArrayListと矛盾するインターフェースを返します

Aug 21 2020

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-

回答

BjørnVester Aug 21 2020 at 10:45

plusメソッドはオーバーロードされ、あなたは間違ったものを見ています。

リンクしたFileCollection.plusのAPIには、次の署名があります。

FileCollectionplus(FileCollectionコレクション)

このコレクションと指定されたコレクションの和集合を含むFileCollectionを返します。返されたコレクションはライブであり、両方のソースコレクションへの変更を追跡します。

ただしArrayList、パラメータとしてを渡しています。アンはArrayListありませんFileCollection

ただし、aFileCollectionもであるIterableため、実際に呼び出すのは、次のシグネチャを持つ標準のGroovyメソッドInterable.plusです。

パブリックコレクションプラス(Iterableright)

2つの反復可能オブジェクトの和集合としてコレクションを作成します。左の反復可能オブジェクトがセットの場合、返されるコレクションはセットになり、それ以外の場合はリストになります。この操作では、オペランドは変更されませんが、常に結果の新しいオブジェクトが作成されます。

「左」の反復可能オブジェクトはSet(ではありませんFileCollection)ではないため、List元に戻り、GroovyArrayListは実装でたまたまを使用します。