Saya mengalami beberapa masalah dalam menavigasi aturan Java untuk menyimpulkan parameter tipe generik. Pertimbangkan kelas berikut, yang memiliki parameter daftar opsional:
import java.util.Collections;
import java.util.List;
public class Person {
private String name;
private List<String> nicknames;
public Person(String name) {
this(name,Collections.emptyList());
}
public Person(String name,List<String> nicknames) {
this.name = name;
this.nicknames = nicknames;
}
}
Kompiler Java saya memberikan kesalahan berikut:
Person.java:9: The constructor Person(String, List<Object>) is undefined
Tapi Collections.emptyList()
tipe pengembalian <T> List<T>
, bukan List<Object>
. Menambahkan gips tidak membantu
public Person(String name) {
this(name,(List<String>)Collections.emptyList());
}
hasil panen
Person.java:9: inconvertible types
Menggunakan EMPTY_LIST
bukanemptyList()
public Person(String name) {
this(name,Collections.EMPTY_LIST);
}
hasil panen
Person.java:9: warning: [unchecked] unchecked conversion
Sedangkan perubahan berikut membuat kesalahan hilang:
public Person(String name) {
this.name = name;
this.nicknames = Collections.emptyList();
}
Adakah yang bisa menjelaskan aturan pengecekan jenis apa yang saya hadapi di sini, dan cara terbaik untuk mengatasinya? Dalam contoh ini, contoh kode akhir memuaskan, tetapi dengan kelas yang lebih besar, saya ingin dapat menulis metode mengikuti pola "parameter opsional" ini tanpa menggandakan kode.
Untuk kredit tambahan: Kapan tepat untuk menggunakan EMPTY_LIST
sebagai lawan emptyList()
?