gradle: fileCollection.plus () restituisce ArrayList che contraddice l'interfaccia
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
Il plus
metodo è 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 ArrayList
come parametro. An ArrayList
non è 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 List
back, e Groovy usa semplicemente un ArrayList
nell'implementazione.