Apakah ada cara untuk melemparkan objek untuk mengembalikan nilai metode? Saya mencoba cara ini tetapi memberikan pengecualian waktu kompilasi di bagian "instanceof":
public static <T> T convertInstanceOfObject(Object o) {
if (o instanceof T) {
return (T) o;
} else {
return null;
}
}
Saya juga mencoba yang ini tetapi itu memberikan pengecualian runtime, ClassCastException:
public static <T> T convertInstanceOfObject(Object o) {
try {
T rv = (T)o;
return rv;
} catch(java.lang.ClassCastException e) {
return null;
}
}
Apakah ada cara yang mungkin untuk melakukan ini dengan mudah:
String s = convertInstanceOfObject("string");
System.out.println(s); // should print "string"
Integer i = convertInstanceOfObject(4);
System.out.println(i); // should print "4"
String k = convertInstanceOfObject(345435.34);
System.out.println(k); // should print "null"
EDIT: Saya menulis salinan jawaban yang benar:
public static <T> T convertInstanceOfObject(Object o, Class<T> clazz) {
try {
return clazz.cast(o);
} catch(ClassCastException e) {
return null;
}
}
public static void main(String args[]) {
String s = convertInstanceOfObject("string", String.class);
System.out.println(s);
Integer i = convertInstanceOfObject(4, Integer.class);
System.out.println(i);
String k = convertInstanceOfObject(345435.34, String.class);
System.out.println(k);
}
null
? dan, mengapa Anda tidak mengembalikannyaObject
? Penghapusan Java akan menerjemahkan generik Anda menjadiObject
, jadi mengapa Anda tidak menulis secara langsungpublic static Object convertInstanceOfObject
?Jawaban:
Anda harus menggunakan
Class
instance karena penghapusan tipe generik selama kompilasi.Deklarasi metode itu adalah:
Ini juga dapat digunakan untuk tipe array. Akan terlihat seperti ini:
Perhatikan bahwa ketika
someObject
dilewatkan keconvertToInstanceOfObject
itu memiliki jenis waktu kompilasiObject
.sumber
{ catch(ClassCastException e) { return null; }
- benar tidak bisa dimaafkanSaya menemukan pertanyaan ini dan itu menarik minat saya. Jawaban yang diterima sepenuhnya benar, tapi saya pikir saya memberikan temuan saya pada level kode byte JVM untuk menjelaskan mengapa OP menemukan
ClassCastException
.Saya memiliki kode yang hampir sama dengan kode OP:
dan kode byte yang sesuai adalah:
Perhatikan bahwa
checkcast
instruksi kode byte terjadi pada metode utama bukan metodeconvertInstanceOfObject
danconvertInstanceOfObject
metode tidak memiliki instruksi yang dapat melemparClassCastException
. Karena metode utama tidak menangkapClassCastException
maka ketika Anda menjalankan metode utama Anda akan mendapatkanClassCastException
dan bukan harapan pencetakannull
.Sekarang saya mengubah kode menjadi jawaban yang diterima:
Kode byte yang sesuai adalah:
Perhatikan bahwa ada
invokevirtual
instruksi dalamconvertInstanceOfObject
metode yang memanggilClass.cast()
metode yang melemparClassCastException
yang akan ditangkap olehcatch(ClassCastException e)
bock dan kembalinull
; karenanya, "null" dicetak ke konsol tanpa kecuali.sumber
Jika Anda tidak ingin bergantung pada melempar pengecualian (yang mungkin sebaiknya tidak Anda lakukan), Anda dapat mencoba ini:
sumber
isAssignableFrom
.