Java'da değişken türü nasıl kontrol edilir?


Yanıtlar:


111

Java statik olarak yazılmış bir dildir, bu nedenle derleyici bu kontrolün çoğunu sizin için yapar. Bir değişkeni belirli bir tür olarak ilan ettiğinizde, derleyici ona yalnızca o türden değerlerin (veya bu türün alt türleri olan değerlerin) atanmasını sağlayacaktır.

Verdiğiniz örnekler ( intdizi, double) bunların tümü ilkeldir ve bunların alt türleri yoktur. Bu nedenle, bir değişkeni bir int:

int x;

Sadece intdeğerleri tutacağından emin olabilirsiniz .

Bir değişkeni a olarak Listtanımladıysanız, değişkenin alt türlerini tutması mümkündür List. Bunların örnekleri arasında ArrayList, LinkedListvs.

Bir Listdeğişkeniniz varsa ve bunun bir değişken olup olmadığını ArrayListbilmeniz gerekiyorsa, aşağıdakileri yapabilirsiniz:

List y;
...
if (y instanceof ArrayList) { 
  ...its and ArrayList...
}

Bununla birlikte, kendinizi bunu yapmanız gerektiğini düşünürken bulursanız, yaklaşımınızı yeniden düşünmek isteyebilirsiniz. Çoğu durumda, nesneye yönelik ilkeleri izlerseniz, bunu yapmanıza gerek kalmaz. Elbette her kuralın istisnaları vardır.


3
İnstanceof operatörü yalnızca değişken tarafından başvurulan nesnenin veri tipini belirler. Başlangıçta talep edildiği gibi gerçek VARIABLE'ın veri türünü belirlemez.
GrantRobertson

38

Java'nın aşırı yöntem yükleme yeteneğini kötüye kullanarak kendi test cihazınızı kullanmak aslında oldukça kolaydır. SDK'da resmi bir yöntem olup olmadığını merak etmeme rağmen.

Misal:

class Typetester {
    void printType(byte x) {
        System.out.println(x + " is an byte");
    }
    void printType(int x) {
        System.out.println(x + " is an int");
    }
    void printType(float x) {
        System.out.println(x + " is an float");
    }
    void printType(double x) {
        System.out.println(x + " is an double");
    }
    void printType(char x) {
        System.out.println(x + " is an char");
    }
}

sonra:

Typetester t = new Typetester();
t.printType( yourVariable );

21
İyi bir yöntem değil IMO. Typetester sınıfınızda tanımlanmayan rasgele bir tür geçirirsem ne olur - örneğin bu String örneğinde?
Tash Pemhiwa

6
@TashPemhiwa ardından seçimlere Dize ve Nesne ekleyin. Yaratıcılık ve problem çözme, programcıların en iyi varlıklarıdır.
Kato

8
Yine de bu, yalnızca önceden tanımlanmış sabit bir sınıf kümesiyle başa çıkabilir (nesne yönelimi / polimorfizmin amacını ortadan
kaldırır

3
Hangi imzanın çalışma zamanında değil, derleme zamanında olacağının seçimi. Bu nedenle bu teknik, derleme zamanında bilmediğiniz hiçbir şeyi size söylemeyecektir. docs.oracle.com/javase/specs/jls/se7/html/...
JMH

26

a.getClass().getName()- size tarafından atıfta bulunulan gerçek nesnenin veri türünü verir a, ancak değişkenin abaşlangıçta bildirildiği veya daha sonra dönüştürüldüğü veri türünü vermez .

boolean b = a instanceof String- atıfta bulunulan gerçek nesnenin abelirli bir sınıfın bir örneği olup olmadığını size verecektir . Yine, değişkenin abaşlangıçta olarak bildirildiği veya daha sonra dönüştürüldüğü veri türünün, operatörün örneğinin sonucuyla hiçbir ilgisi yoktur.

Bu bilgiyi şu kaynaktan aldım: Java'da bir değişken türünü nasıl biliyorsunuz?

Bu olabilir. A'yı Stringbir int olarak ayrıştırmaya çalışıyorum ve Integer.parseInt(s.substring(a, b))özetlemeye çalışmadan önce benim int mi yoksa çöp mü attığını bilmek istiyorum .

Bu arada, buna Yansıma denir. Konuyla ilgili daha fazla bilgi: http://docs.oracle.com/javase/tutorial/reflect/


14

İnt yerine Tamsayı, double yerine Double vb. İle çalışabilirsiniz (bu tür sınıflar tüm ilkel türler için mevcuttur). O zaman operatör instanceof'unu kullanabilirsiniz.if(var instanceof Integer){...}


2
Tek ihtiyacımız olan geçerli bir kullanım durumu.
Marquis of Lorne

En verimli yaklaşım gibi görünüyor.
I. Tyger

13

Sadece kullan:

.getClass().getSimpleName();

Misal:

StringBuilder randSB = new StringBuilder("just a String");
System.out.println(randSB.getClass().getSimpleName());

Çıktı:

StringBuilder

1
randSBNULL tutarsa bunun işe yaramayacağını belirtmek isterim .
Basil Bourque

8

Bence değişken türünü kontrol etmek bu şekilde yapılabilir.

public <T extends Object> void checkType(T object) {    
    if (object instanceof Integer)
        System.out.println("Integer ");
    else if(object instanceof Double)
        System.out.println("Double ");
    else if(object instanceof Float)
        System.out.println("Float : ");
    else if(object instanceof List)
        System.out.println("List! ");
    else if(object instanceof Set)
        System.out.println("Set! ");
}

Bu şekilde, birden fazla aşırı yüklenmiş yönteme sahip olmanız gerekmez. Ek faydalar nedeniyle koleksiyonları diziler üzerinde kullanmanın iyi bir uygulama olduğunu düşünüyorum. Bunu söyledikten sonra, bir dizi türünü nasıl kontrol edeceğimi bilmiyorum. Belki birisi bu çözümü geliştirebilir. Bu yardımcı olur umarım!

Not: Evet, bunun ilkelleri de kontrol etmediğini biliyorum.


6

Sorunuzun ilk kısmı anlamsız. Derleme zamanında ilkel bir değişkenin türünü bilmediğiniz bir durum yoktur.

İkinci kısımda, bir değişkenin bir dizi olup olmadığını bilmediğiniz tek durum, bunun bir Nesne olup olmadığıdır. Bu durumda object.getClass().isArray()size söyleyeceğim.


5
Dizeden nesneye bir hashmap alabilirim, bu hashmap'e bir int koyabilir ve onu geri çekebilirim. Bildiğim tek şey, bunun bir "nesne" olduğu ve ne tür olduğunu kontrol etmem gerekebileceği. İyi olduğunu söylemiyorum, sadece mümkün olduğunu söylüyorum.
matty-d


2

Bu cevapların hiçbirinden memnun değildim ve doğru olanın açıklaması ve olumsuz oyları olmadığı için etrafı araştırdım, bazı şeyler buldum ve anlaşılması kolay olacak şekilde düzenledim. Onunla bir oyun oynayın, birinin umduğu kadar basit değil.

//move your variable into an Object type
Object obj=whatYouAreChecking;
System.out.println(obj);

// moving the class type into a Class variable
Class cls=obj.getClass();
System.out.println(cls);

// convert that Class Variable to a neat String
String answer = cls.getSimpleName();
System.out.println(answer);

İşte bir yöntem:

public static void checkClass (Object obj) {
    Class cls = obj.getClass();
    System.out.println("The type of the object is: " + cls.getSimpleName());       
}

1

Değişken başlatılmamış genel bir türse bu yanıtların hiçbiri işe yaramaz

Ve bulabildiğim kadarıyla, bu yalnızca son derece çirkin bir geçici çözüm kullanarak veya işlevinize ilklendirilmiş bir parametre göndererek ve onu yerinde yaparak mümkündür, buraya bakın:

<T> T MyMethod(...){ if(T.class == MyClass.class){...}}

Çalışma Tzamanında silindiğinden , türü doğrudan parametreden çıkaramayacağınız için geçerli DEĞİLDİR .

<T> void MyMethod(T out, ...){ if(out.getClass() == MyClass.class){...}}

Bu işe yarar çünkü çağıran, outaramadan önce değişkeni somutlaştırmaktan sorumludur . Bu, çağrıldığında boşsa yine de bir istisna atacaktır, ancak bağlantılı çözüme kıyasla, bunu yapmanın en kolay yolu budur.

Bunun bir tür özel uygulama olduğunu biliyorum, ancak bu, google'da java ile bir değişkenin türünü bulmak için ilk sonuç olduğu için (ve bu Tbir tür değişken olduğu göz önüne alındığında ), dahil edilmesi gerektiğini düşünüyorum.



0

Temel olarak, Örneğin:

public class Kerem
{
    public static void main(String[] args)
    {
        short x = 10;
        short y = 3;
        Object o = y;
        System.out.println(o.getClass()); // java.lang.Short
    }

}

1
Küçük bir ipucu: 10 yaşında olan ve bazılarının 100'den fazla olumlu oy aldığı 10'dan fazla yanıtı olan bir soru olduğunda, o zaman (imkansız değil ama) yeni bir cevabın yararlı bir şeyler ekleyebilmesi çok , çok düşük bir olasılıktır (özellikle, sadece "İşte, bak, bu bir şey yazdırıyor" yazan bir kod parçası olduğunda ...)
Marco13

-4

public class Demo1 {

Object printType(Object o)
{
    return o;
}
 public static void main(String[] args) {

    Demo1 d=new Demo1();
    Object o1=d.printType('C');
    System.out.println(o1.getClass().getSimpleName());

}

}

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.