Sınıf B
ve sınıf sınıfı C
genişletirse A
ve bir tür nesnem varsa B
veya C
hangi türün bir örnek olduğunu nasıl belirleyebilirim?
Sınıf B
ve sınıf sınıfı C
genişletirse A
ve bir tür nesnem varsa B
veya C
hangi türün bir örnek olduğunu nasıl belirleyebilirim?
Yanıtlar:
if (obj instanceof C) {
//your code
}
if(!(obj instanceof C))
code
Alt1 alt1 = yeni Alt1 (); Parent1 parentChild = yeni Child2 (); Child2 child2 = yeni Child2 (); (Çocuk1 Ebeveyn1 örneği); (çocuk1 Çocuk1 örneği); (parentChild Child2 örneği); (parentChild Ebeveyn1 örneği); (parentChild Child1 örneği); code
, örnekleme niyetini temizleyebilir.
Object.getClass () kullanın . Nesnenin çalışma zamanı türünü döndürür.
Birden fazla doğru cevap sunuldu, ancak yine de daha fazla yöntem var: Class.isAssignableFrom()
ve sadece nesneyi atmaya çalışmak (ki bu da a ClassCastException
).
Bir nesnenin obj
türün bir örneği olup olmadığını test etmenin olası yollarını özetleyelim 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
Elleçleme farklarıBununla birlikte kullanımda bir fark var null
:
false
durumunda obj
olduğunu null
( null
bir şey örneği değildir).NullPointerException
açıkça atar .null
çünkü null
her tür için kullanılabilir!Hatırlamak için:
null
değil herhangi türde bir örneği ama dökülebilir her tür.
Class.getName()
nesne türü değilse ancak alt sınıfı ise "is-instance-of" test becase gerçekleştirmek için kullanılmamalıdır C
, tamamen farklı bir isim ve pakete sahip olabilir (bu nedenle sınıf adları açıkça eşleşmeyecektir), ancak hala tip C
.Class.isAssignableFrom()
değildir : türü bir alt sınıf ise dönecekti .obj.getClass().isAssignableFrom(C.class)
false
obj
C
Kullanabilirsiniz:
Object instance = new SomeClass();
instance.getClass().getName(); //will return the name (as String) (== "SomeClass")
instance.getClass(); //will return the SomeClass' Class object
HTH. Ancak çoğu zaman bunu kontrol akışı veya benzeri bir şey için kullanmak iyi bir uygulama değildir ...
Önerilen yöntemlerden herhangi birinin kullanılması, kötü bir OO tasarımına dayanan bir kod kokusu olarak kabul edilir.
Tasarımınız iyi ise, kendinizi kullanmanız gerektiğini getClass()
veya bulacağınızı görmemelisiniz instanceof
.
Önerilen yöntemlerden herhangi biri yapacak, ancak sadece tasarım açısından akılda tutulması gereken bir şey.
Bu durumda yansımayı kullanabiliriz
objectName.getClass().getName();
Misal:-
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String name = request.getClass().getName();
}
Bu durumda, nesnenin HttpServletRequest
arabirim referans değişkenine ilettiği sınıfın adını alırsınız .
obj.getClass()
className, prefixex kelimesini class
request.getClass().getName();
tüm paketi yazdırır! sınıf adı ile birlikte
.isInstance
" Class
" Sınıfında da bir yöntem vardır . bir nesnenin sınıfını üzerinden myBanana.getClass()
alırsanız, nesnenizin via ile myApple
aynı sınıfın bir örneği olup olmadığını görebilirsiniz.myBanana
myBanana.getClass().isInstance(myApple)
isinstance()
çalışma zamanında bilmek istiyorsanız ile kontrol yeterli olmaz. kullanın:
if(someObject.getClass().equals(C.class){
// do something
}
GeneralUtils sınıfımda blow işlevini kullanıyorum, yararlı olup olmadığını kontrol edin
public String getFieldType(Object o) {
if (o == null) {
return "Unable to identify the class name";
}
return o.getClass().getName();
}
Anahtar vakasını kullanmak yerine çalışma zamanında nesne örneğini elde etmek için Java 8 jeneriklerini kullandım
public <T> void print(T data) {
System.out.println(data.getClass().getName()+" => The data is " + data);
}
herhangi bir veri türünü ilettiğinizde yöntem, arama sırasında ilettiğiniz veri türünü yazdıracaktır. Örneğin
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);
Aşağıdaki çıktı
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 []