gradle: fileCollection.plus () zwraca ArrayList sprzeczny interfejs

Aug 21 2020

gradle: fileCollection.plus () zwraca ArrayList sprzeczny interfejs.

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

Ale powinien zwrócić FileCollection:

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

Odpowiedzi

BjørnVester Aug 21 2020 at 10:45

plusMetoda jest przeciążony i szukasz w złym jeden.

Interfejs API dla FileCollection.plus, do którego utworzyłeś łącze , ma podpis:

FileCollection plus (kolekcja FileCollection)

Zwraca FileCollection, który zawiera unię tej kolekcji i danej kolekcji. Zwrócona kolekcja jest aktywna i śledzi zmiany w obu kolekcjach źródłowych.

Ale przekazujesz ArrayListjako parametr. Nie ArrayListjest FileCollection.

Jednak a FileCollectionjest również an Iterable, więc to, co naprawdę wywołujesz, to standardowa metoda Groovy Interable.plus z tym podpisem:

public Collection plus (iterowalne prawo)

Utwórz kolekcję jako połączenie dwóch iterowalnych. Jeśli iterowalna po lewej stronie jest zestawem, zwrócona kolekcja będzie zestawem, w przeciwnym razie listą. Ta operacja zawsze tworzy nowy obiekt dla wyniku, podczas gdy operandy pozostają niezmienione.

Ponieważ iterowalne „lewe” nie jest a Set(to jest a FileCollection), otrzymujesz Listodwrotność, a Groovy po prostu używa ArrayListw implementacji.