Ada dua masalah di sini.
(a) new ArrayList<?>
bukan ekspresi hukum.
Jika Anda ingin membuat daftar yang dapat menampung String dan Integer, Anda perlu menggunakan ArrayList<Object>
karena Object
adalah tipe super umum (paling spesifik) dari String
dan Integer
:
ArrayList<Object> list = new ArrayList<Object>;
list.add('abcd'); // insert a string
list.add(1234); // insert an integer
Sisi buruknya adalah ketika Anda mengekstrak item dari daftar ini, item tersebut akan bertipe Object
sehingga Anda perlu menurunkannya:
String s = (String) list.get(0);
Integer n = (Integet) list.get(1);
(b) Mengenai simbol wildcard ?
:
Ini dapat digunakan untuk menentukan tipe variabel, seperti pada: ArrayList<?> list = ...
tetapi tidak dapat digunakan dalam ekspresi new
. Dengan kata lain, ungkapan ini ilegal: new ArrayList<?>
.
Wildcard berguna untuk mengizinkan polimorfisme (terbatas) antar daftar. Secara khusus, jika Anda memiliki Daftar Integer
s dan Anda ingin memperlakukannya seperti daftar Number
(yang masuk akal karena Integer
adalah subkelas dari Number
), Anda dapat menggunakan simbol wildcard.
ArrayList<Integer> list2 = new ArrayList<Integer>();
list2.add(100);
list2.add(200);
// This assignment is OK:
ArrayList<? extends Number> list3 = list2;
Number n = list3.get(0); // n is now 100
Namun, masalah dengan list3 (atau daftar lain dengan tipe wildcard) adalah Anda tidak dapat mengubahnya. Misalnya, jika Anda mencoba menambahkan elemen ke daftar ini:
list3.add(300); // <-- This is not allowed
Anda akan mendapatkan kesalahan waktu kompilasi.
person
Itay Maman
schedule
05.07.2014
List<?>
sebagai antarmuka mewakili batasanList<? extends Object>
. Tidak terlalu membatasi. - person EpicPandaForce   schedule 05.07.2014