Jika kelas B
dan kelas C
memperpanjang kelas A
dan saya memiliki sebuah objek dari tipe B
atau C
, bagaimana saya bisa menentukan dari jenis ini adalah turunan?
Beberapa jawaban yang tepat disajikan, tetapi masih ada banyak lagi metode: Kelas.isAssignableFrom()
dan hanya mencoba untuk melemparkan objek (yang mungkin melemparkan ClassCastException
).
Let's meringkas cara yang mungkin untuk menguji apakah sebuah objek obj
adalah contoh dari jenis C
:
// Method #1
if (obj instanceof C)
;
// Method #2
if (C.class.isInstance(obj))
;
// Method #3
if (C.class.isAssignableFrom(obj.getClass()))
;
// Method #4
try {
C c = (C) obj;
// No exception: obj is of type C or IT MIGHT BE NULL!
} catch (ClassCastException e) {
}
// Method #5
try {
C c = C.class.cast(obj);
// No exception: obj is of type C or IT MIGHT BE NULL!
} catch (ClassCastException e) {
}
null
penangananAda perbedaan dalam null
penanganan meskipun:
palsu
jika obj
adalah null
(null
adalah bukan contoh dari apa-apa).NullPointerException
jelas. null
karena null
dapat cor untuk semua jenis!mengingat:
null
tidak contoh dari jenis apa pun, tapi itu dapat cast untuk setiap jenis.
Kelas.getName()
tidak boleh digunakan untuk melakukan "adalah contoh-" tes karena jika objek bukan tipe C
, tapi sebuah subclass dari itu, mungkin memiliki nama yang sama sekali berbeda dan paket (oleh karena itu nama kelas akan jelas tidak cocok) tapi itu masih tipe C
.Kelas.isAssignableFrom()
adalah tidak symmetric:
obj.getClass().isAssignableFrom(C.class)
akan kembali palsu
jika jenis obj
adalah sebuah subclass dari C
.Anda dapat menggunakan:
Object instance = new SomeClass();
instance.getClass().getName(); //will return the name (as String) (== "SomeClass")
instance.getClass(); //will return the SomeClass' Class object
HTH. Tapi saya pikir sebagian besar waktu itu adalah praktik yang baik untuk digunakan untuk mengontrol aliran atau sesuatu yang serupa...
Penggunaan salah satu metode yang disarankan adalah dianggap sebagai kode bau yang berbasis di buruk OO desain.
Jika desain anda baik, anda tidak harus menemukan diri anda perlu untuk menggunakan getClass()
atau instanceof
.
Salah satu metode yang disarankan akan dilakukan, tetapi hanya sesuatu yang perlu diingat, desain-bijaksana.
Kita dapat menggunakan refleksi dalam hal ini
objectName.getClass().getName();
Contoh:-
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String name = request.getClass().getName();
}
Dalam hal ini anda akan mendapatkan nama kelas objek yang lulus untuk HttpServletRequest
antarmuka pustaka variabel.
Ada juga yang .isInstance
metode "Kelas
" kelas. jika anda mendapatkan sebuah objek's class melalui myBanana.getClass()
dapat anda lihat jika anda objek myApple
adalah sebuah instance dari kelas yang sama sebagai myBanana
via
myBanana.getClass().isInstance(myApple)