gradle: fileCollection.plus () restituisce ArrayList che contraddice l'interfaccia

Aug 21 2020

gradle: fileCollection.plus () restituisce ArrayList che contraddice l'interfaccia.

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

Ma dovrebbe restituire un FileCollection:

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

Risposte

BjørnVester Aug 21 2020 at 10:45

Il plusmetodo è sovraccarico e stai guardando quello sbagliato.

L'API per FileCollection.plus a cui ti sei collegato ha la firma:

FileCollection plus (raccolta FileCollection)

Restituisce un FileCollection che contiene l'unione di questa raccolta e la raccolta specificata. La raccolta restituita è attiva e tiene traccia delle modifiche a entrambe le raccolte di origine.

Ma stai passando un ArrayListcome parametro. An ArrayListnon è un FileCollection.

Tuttavia, a FileCollectionè anche un Iterable, quindi ciò che stai davvero invocando è il metodo Groovy standard Interable.plus con questa firma:

public Collection plus (Iterable right)

Crea una raccolta come unione di due iterabili. Se l'iterabile sinistro è un Set, la raccolta restituita sarà un Set, altrimenti un List. Questa operazione creerà sempre un nuovo oggetto per il risultato, mentre gli operandi rimangono invariati.

Poiché l'iterabile "left" non è un Set(è un FileCollection), ottieni un Listback, e Groovy usa semplicemente un ArrayListnell'implementazione.