Membuat Daftar Array baru

saya punya pertanyaan tentang membuat daftar array baru.

Jika saya membuat yang baru, dengan

ArrayList <?> listtwo = new ArrayList<?>();

Apa yang bisa saya masukkan ke dalam array? Bisakah saya memasukkan String dan Integer ke dalamnya? Atau bagaimana cara kerjanya.

Saya tahu itu jika Anda membuat daftar seperti:

ArrayList<String> list =new ArrayList<String>(); 

bahwa Anda hanya dapat memasukkan Strings ke dalamnya. dan jika Anda mencoba melakukan hal lain, ini akan memberikan pengecualian kompilasi.


person user3807485    schedule 05.07.2014    source sumber
comment
Anda cukup memasukkan nilai string ke dalam ArrayList‹String› dan jika Anda ingin memasukkan nilai lain, Anda harus mengubahnya menjadi string!   -  person Mohsen fallahi    schedule 05.07.2014
comment
Saya tahu Anda bisa melakukannya di ArrayList‹string› tetapi pertanyaan saya adalah, apa yang bisa saya masukkan ke dalam Arraylist‹?›   -  person user3807485    schedule 05.07.2014
comment
List<?> sebagai antarmuka mewakili batasan List<? extends Object>. Tidak terlalu membatasi.   -  person EpicPandaForce    schedule 05.07.2014
comment
Saya memposting beberapa informasi tentang obat generik di sini: stackoverflow.com/questions/24574478/   -  person EpicPandaForce    schedule 05.07.2014


Jawaban (2)


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 Integers 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

Jika saya membuat yang baru, dengan

ArrayList <?> listtwo = new ArrayList<?>();

Anda tidak bisa. Anda tidak dapat membuat instance tipe berparameter tanpa batas. Inilah yang akan dikatakan oleh kompiler:

      ArrayList <?> listtwo = new ArrayList<?>();
                                           ^
  required: class or interface without bounds
  found:    ?

Jadi pertanyaan tentang apa yang bisa Anda masukkan ke dalamnya masih bisa diperdebatkan.

Jika Anda tidak memberikan parameter tipe sama sekali:

ArrayList listtwo = new ArrayList();

...Anda dapat memasukkan apa pun yang Anda suka ke dalamnya (termasuk campurannya). Nilai-nilai primitif akan dipaksa ke objek yang setara (int =› Integer, dll.). Pada titik itu, pada dasarnya ini adalah instance ArrayList<Object>.

person T.J. Crowder    schedule 05.07.2014
comment
Terima kasih, saya bingung tentang ini! - person user3807485; 05.07.2014