gradle: fileCollection.plus () zwraca ArrayList sprzeczny interfejs
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
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.