gradle: fileCollection.plus () mengembalikan antarmuka yang bertentangan dengan ArrayList

Aug 21 2020

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

BjørnVester Aug 21 2020 at 10:45

The plusmetode 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 ArrayListsebagai parameter. An ArrayListbukan FileCollection.

Namun, a FileCollectionjuga 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 Listback, dan Groovy kebetulan menggunakan an ArrayListdalam implementasinya.