Jika kelas B
dan kelas C
memperluas kelas A
dan saya memiliki objek tipe B
atau C
, bagaimana saya bisa menentukan tipe mana yang merupakan instance?
Jika kelas B
dan kelas C
memperluas kelas A
dan saya memiliki objek tipe B
atau C
, bagaimana saya bisa menentukan tipe mana yang merupakan instance?
Jawaban:
if (obj instanceof C) {
//your code
}
if(!(obj instanceof C))
code
Child1 berikut child1 = new Child1 (); Parent1 parentChild = new Child2 (); Child2 child2 = new Child2 (); (child1 instance dari Parent1); (child1 instanceof Child1); (instance parentChild Child2); (instance parentChild dari Parent1); (instance parentChild Child1); code
, itu dapat menghapus maksud instanceof.
Gunakan Object.getClass () . Ini mengembalikan tipe objek runtime.
Beberapa jawaban benar disajikan, tetapi masih ada lebih banyak metode: Class.isAssignableFrom()
dan hanya berusaha untuk melemparkan objek (yang mungkin melempar a ClassCastException
).
Mari merangkum cara-cara yang mungkin untuk menguji apakah suatu objek obj
adalah turunan dari tipe 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
penangananNamun ada perbedaan null
penanganan:
false
jika obj
ini null
( null
tidak instance dari apa-apa).NullPointerException
jelas.null
karena null
dapat digunakan untuk semua jenis!Yang perlu diingat:
null
ini bukan turunan dari tipe apa pun tetapi dapat dilemparkan ke tipe apa pun.
Class.getName()
tidak boleh digunakan untuk melakukan tes "adalah-contoh-dari" karena objek bukan tipe C
tetapi subkelasnya, ia mungkin memiliki nama dan paket yang sama sekali berbeda (oleh karena itu nama kelas jelas tidak akan cocok) tetapi itu adalah masih bertipe C
.Class.isAssignableFrom()
tidak simetris : obj.getClass().isAssignableFrom(C.class)
akan kembali false
jika jenisnya obj
adalah subkelas dari C
.Kamu bisa 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 bukan praktik yang baik untuk menggunakannya untuk aliran kontrol atau sesuatu yang serupa ...
Setiap penggunaan metode yang disarankan dianggap sebagai bau kode yang didasarkan pada desain OO yang buruk.
Jika desain Anda bagus, Anda seharusnya tidak perlu menggunakan getClass()
atau instanceof
.
Salah satu metode yang disarankan akan dilakukan, tetapi hanya sesuatu yang perlu diingat, desain-bijaksana.
Kita dapat menggunakan refleksi dalam kasus 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 yang objek dilewatkan ke HttpServletRequest
variabel referensi antarmuka.
obj.getClass()
akan mengembalikan className, awalan dengan kataclass
request.getClass().getName();
mencetak semua paket! bersama dengan nama kelas
Ada juga .isInstance
metode di kelas " Class
". jika Anda mendapatkan kelas objek melalui myBanana.getClass()
Anda dapat melihat apakah objek Anda myApple
adalah instance dari kelas yang sama dengan myBanana
via
myBanana.getClass().isInstance(myApple)
mengecek dengan isinstance()
tidak akan cukup jika Anda ingin tahu di run time. menggunakan:
if(someObject.getClass().equals(C.class){
// do something
}
Saya menggunakan fungsi blow di kelas GeneralUtils saya, periksa semoga bermanfaat
public String getFieldType(Object o) {
if (o == null) {
return "Unable to identify the class name";
}
return o.getClass().getName();
}
Saya Menggunakan Java 8 generics untuk mendapatkan instance objek saat runtime daripada harus menggunakan switch case
public <T> void print(T data) {
System.out.println(data.getClass().getName()+" => The data is " + data);
}
lulus semua jenis data dan metode ini akan mencetak jenis data yang Anda lewati saat memanggilnya. misalnya
String str = "Hello World";
int number = 10;
double decimal = 10.0;
float f = 10F;
long l = 10L;
List list = new ArrayList();
print(str);
print(number);
print(decimal);
print(f);
print(l);
print(list);
Berikut ini adalah output
java.lang.String => The data is Hello World
java.lang.Integer => The data is 10
java.lang.Double => The data is 10.0
java.lang.Float => The data is 10.0
java.lang.Long => The data is 10
java.util.ArrayList => The data is []