gradle: fileCollection.plus () mengembalikan antarmuka yang bertentangan dengan ArrayList
gradle: fileCollection.plus () mengembalikan antarmuka yang bertentangan dengan ArrayList.
def foo = files([]); // foo: gradle FileCollection
println foo.class
foo = foo.plus(sourceSets.main.java.srcDirs); // foo: java.util.ArrayList
println foo.class
Tapi itu harus mengembalikan FileCollection:
https://docs.gradle.org/current/javadoc/org/gradle/api/file/FileCollection.html#plus-org.gradle.api.file.FileCollection-
Jawaban
The plus
metode kelebihan beban, dan Anda melihat salah satu.
API untuk FileCollection.plus yang Anda tautkan memiliki tanda tangan:
FileCollection plus (koleksi FileCollection)
Mengembalikan FileCollection yang berisi penyatuan koleksi ini dan koleksi yang diberikan. Koleksi yang dikembalikan bersifat langsung, dan melacak perubahan pada kedua koleksi sumber.
Tapi Anda melewatkan an ArrayList
sebagai parameter. An ArrayList
bukan FileCollection
.
Namun, a FileCollection
juga merupakan Iterable
, jadi yang sebenarnya Anda gunakan adalah metode Groovy standar Interable.plus dengan tanda tangan ini:
Koleksi publik plus (Iterable right)
Buat Koleksi sebagai gabungan dari dua iterable. Jika iterable kiri adalah Set, maka koleksi yang dikembalikan akan menjadi Set, sebaliknya Daftar. Operasi ini akan selalu membuat objek baru untuk hasilnya, sedangkan operan tetap tidak berubah.
Karena iterable "kiri" bukan Set
(itu a FileCollection
), Anda mendapatkan List
back, dan Groovy kebetulan menggunakan an ArrayList
dalam implementasinya.