Berikut ini adalah cuplikan tentang cara membuat kelas generik java untuk menambahkan satu item ke array. Bagaimana saya bisa membuat appendToArray metode statis. Menambahkan statis ke hasil tanda tangan metode dalam kesalahan kompilasi.
public class ArrayUtils<E> {
public E[] appendToArray(E[] array, E item) {
E[] result = (E[])new Object[array.length+1];
result[array.length] = item;
return result;
}
}
Jawaban:
satu-satunya hal yang dapat Anda lakukan adalah mengubah tanda tangan Anda
Detail penting:
Ekspresi generik sebelum nilai kembali selalu memperkenalkan (menyatakan) variabel tipe generik baru.
Selain itu, ketik variabel antara types (
ArrayUtils
) dan metode statis (appendToArray
) tidak pernah saling mengganggu.Jadi, apa artinya ini: Dalam jawaban saya
<E>
akan menyembunyikanE
dariArrayUtils<E>
jika metode tidak akanstatic
. DAN<E>
tidak ada hubungannya denganE
dariArrayUtils<E>
.Untuk mencerminkan fakta ini dengan lebih baik, jawaban yang lebih benar adalah:
sumber
E
dan variabel tipe metode statisE
. Saya menganggap itu praktik yang jauh lebih baik untuk menggunakan nama variabel yang berbeda ketika mendeklarasikan metode generik, statis atau sebaliknya, di dalam kelas generik.Perhatikan
<E>
.Metode generik statis memerlukan deklarasi generik sendiri (
public static <E>
) terpisah dari deklarasi generik kelas (public class ArrayUtils<E>
).Jika kompiler mengeluh tentang ambiguitas jenis dalam memanggil metode generik statis (sekali lagi tidak mungkin dalam kasus Anda, tetapi, secara umum, untuk berjaga-jaga), berikut ini cara memanggil metode generik statis secara eksplisit menggunakan jenis tertentu (
_class_.<_generictypeparams_>_methodname_
):Ini hanya akan terjadi jika kompilator tidak dapat menentukan tipe generik karena, misalnya tipe generik tidak terkait dengan argumen metode.
sumber
Anda perlu memindahkan parameter tipe ke level metode untuk menunjukkan bahwa Anda memiliki metode generik daripada kelas generik:
sumber
Saya akan menjelaskannya dengan cara yang sederhana.
Generik yang didefinisikan pada level Kelas sepenuhnya terpisah dari generik yang didefinisikan pada level metode (statis).
Ketika Anda melihat kode di atas di mana saja, harap dicatat bahwa T yang didefinisikan di tingkat kelas tidak ada hubungannya dengan T yang didefinisikan dalam metode statis. Kode berikut ini juga sepenuhnya valid dan setara dengan kode di atas.
Mengapa metode statis perlu memiliki generiknya sendiri yang terpisah dari kelas?
Jadi, setiap kali Anda memanggil metode statis,
JVM mengartikannya sebagai berikut.
Keduanya memberikan output yang sama.
sumber