Java'da instanceOf (Class <?> C) gibi bir şey var mı?


88

Bir nesnenin osınıfının Cveya alt sınıfının bir örneği olup olmadığını kontrol etmek istiyorum C.

Örneğin, eğer psınıfsa Pointben x.instanceOf(Point.class)olmak trueve aynı zamanda x.instanceOf(Object.class)olmak istiyorum true.

Kutulu ilkel tipler için de çalışmasını istiyorum. Örneğin, eğer bir xise Integero zaman x.instanceOf(Integer.class)olmalıdır true.

Böyle bir şey var mı? Değilse, böyle bir yöntemi nasıl uygulayabilirim?


kutulu sınıflarla
uğraşmak

Yanıtlar:


174

Class.isInstance istediğinizi yapar.

if (Point.class.isInstance(someObj)){
    ...
}

Tabii ki, instanceofbunun yerine kullanabiliyorsanız kullanmamalısınız, ancak yansıtma senaryoları için genellikle kullanışlı olur.


6
@ Muhtemelen daha yavaş, ama daha kötüsü anlamak daha zor! Bir şeyi yapmanın çok basit bir yolu varsa - gibi if (a instanceof Point)- ama bunu daha karmaşık bir şekilde yaparsanız, kodu okuyan kişi "ah, bunun zor yoldan yapılmasının bir nedeni olmalı" diye düşünmeye mahkumdur ve daha sonra Class.isInstancearasındaki farkı öğrenmek için dokümanlara atlayın instanceof. Meslektaşlarınızın zamanını boşa harcıyorsunuz.
gustafc

21

Bir o nesnesinin c sınıfının veya c alt sınıfının bir örneği olup olmadığını kontrol etmek istiyorum. Örneğin, p Point sınıfındaysa x.instanceOf (Point.class) istiyorum

Um ... Ne? O, p ve x nedir?

İlkel tipler için de çalışmasını istiyorum. Örneğin, x bir tamsayı ise, x.instanceOf (Integer.class) ve ayrıca x.instanceOf (Object.class) doğru olmalıdır.

Hayır. Derlememeli bile. Temel öğeler nesneler değildir ve bunlara yöntem çağıramazsınız.

Her neyse, üç şey var, bunlardan biri kesinlikle istediğinizi elde edebilir (tam olarak nerede geçerli olduğuna göre biraz farklıdırlar:

  • instanceofOperatör derleme zamanında sınıf biliyorsanız.
  • Derleme zamanında bilinmeyen bir sınıfa göre bir nesnenin sınıfını kontrol etmek istiyorsanız Class.isInstance () .
  • İki sınıf nesnesi verilen atanabilirliği kontrol etmek istiyorsanız Class.isAssignableFrom () .

9
x instanceof Integer
x instanceof Object

sadece doğru sözdizimini kullanmalısın

ilkel tipler için, bunu tamamen farklı yapmanız gerekir. Onlar için yöntem oluşturamayacağınız için, yöntemi tutan bir sınıfa ihtiyacınız var. Yani "x.instanceOf (Integer.Class)" yerine "MyClassComparer.instanceOf (x, Integer.Class)" veya buna benzer bir şey çağırmalısınız. Bu, yöntemlerin aşırı yüklenmesi ile kolayca uygulanabilir, ancak bu işlevselliğin hiç istenebileceği bir durum göremiyorum.


4

Aslında Java'da, bir nesnenin bir sınıfın örneği mi, bir alt sınıfın örneği mi yoksa belirli bir arabirimi uygulayan bir sınıfın örneği mi olduğunu belirlemek için kullanılabilen instanceof adında bir boole operatörü vardır.

if(obj instanceof SomeClass) {
    // Do something
}

Java Eğitimi'nde bu işleç için iyi bir örnek var


1
ilkel türlerle instanceof kullanamazsınız
dfa

4
İlkel türleri nesnelerle karıştırdı. Lütfen okuyun ... "Örneğin, x bir tamsayı ise, x.instanceOf (Integer.class) ve ayrıca x.instanceOf (Object.class) doğru olmalıdır." Tüm cevapları
küçümsemek

Java Eğitimi'ni kullanma önerisini ikinci kez kullanmak (sp). Dilin kendisini öğrenmek için iyi bir referans.
luis.espinal

0

Yapabilirsin:

if (foo instanceof classNameYouWantToCheck) 

ilkel türlerle instanceof kullanamazsınız
dfa

Sınıf, sınıf adını oraya yazması gerektiğini göstermekti. Ben bunu düzeltmek olacak
fmsf

0

"İlkel türler için de çalışmasını istiyorum. Örneğin, x bir tamsayı ise, x.instanceOf (Integer.class) ve ayrıca x.instanceOf (Object.class) doğru olmalıdır."

Neden? İlkel türler ve başvuru türleri tamamen ayrıdır. İlkel bir tamsayı, Tamsayı veya Nesne'nin bir alt türü değildir. İlkel bir değerin türü, derleme sırasında her zaman statik olarak bilinir, bu nedenle türünü test etmenin bir anlamı yoktur. Elbette, ilkel bir değeri kutuya koyabilir ve ardından türünü test edebilirsiniz:

(Integer)5 instanceof Integer

Ama ne anlamı var?


-2

Ham nesneler ve genel nesneler için instanceof konusunda kafanızın karıştığını düşünüyorum.

obj instanceof Class
obj instanceof Class<?> // this is the one you want

2
Tür silme nedeniyle, instanceof operatörünün sağ tarafında jenerikleri kullanamazsınız.
Matthias

2
Hayır, bu konuda kafası karışan sizsiniz . Sonra ham türü kullanmalısınız instanceof.
Dawood ibn Kareem
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.