Java'da bir değişken türünü nasıl biliyorsunuz?


152

Diyelim ki bir değişken beyan ederim:

String a = "test";

Ve bunun ne tür olduğunu bilmek istiyorum, yani çıktı olmalı java.lang.StringBunu nasıl yapabilirim?


1
Değişkenin türü ile gerçekten ilgileniyor musunuz ? Yoksa değerin türünü önemsiyor musunuz? Değişkenin türü kolayca elde edilemediğinden (aslında yerel değişkenler için hiç mümkün değildir ve alanlar için yansıma gerektirir).
Joachim Sauer

8
@Paul: Düşünün Object o = "o";- değişkenin türü Object, değerin türü String'dir.
Michael Borgwardt

2
@Paul In List<String> l = new ArrayList<String>();, değişkenin List<String>tipi, değerin tipi ArrayList<String>.
Ben Lings

1
@Ben Lings Değişken türü java.util.ArrayList ve değer türü java.util.ArrayList.
Ajay Takur

1
@AjayThakur - derleme zamanı (statik) türü ile çalışma zamanı (dinamik) türü arasındaki farktır.
Ben Lings

Yanıtlar:


269
a.getClass().getName()

16
Bu, değerin türünü verecektir. mutlaka değişkenin türü değildir.
Joachim Sauer

7
Ben sadece OP bildirimi aderleme zamanında oldukça açık olduğu için gerçekten aradığını olduğunu düşündüm
Martin

4
Türler ilkel değilse bu işe yarar ... Tür int ise, türü nasıl bilirim?
Miguel Ribeiro

5
@Miguel: Bir işleyebilir tek yolu beri intdeğer bir olduğunu intdeğişken, kolları bir o yazma koduna hiçbir yolu yoktur intdeğer ve gelmez bu tür biliyorum. Sorun, bir sarıcıyı kullanmanız durumunda farklıdır Integer, ancak daha sonra bu cevabın kodu tekrar çalışır.
Joachim Sauer

1
bu ilkel bir tip için doğru değildir.
Mehdi

37

Adı istiyorsanız, Martin yöntemini kullanın. Bunun belirli bir sınıfın örneği olup olmadığını bilmek istiyorsanız:

boolean b = a instanceof String


15
Sen de Martin değil misin? :)
seokhoonlee

Diğer Martin ... LOL;)
chankruze

Thic kodu Double a = 1d; boolean b = a instanceof String;hataya neden olacakerror: incompatible types: Double cannot be converted to String
Alex78191

35

Oradaki Martin cevabını genişletmek istiyorum ...

Onun çözümü oldukça güzel, ama herhangi bir "değişken tipi" böyle yazdırılabilir böylece tweaked edilebilir. (Aslında Value Type, konuyla ilgili daha fazla ). Bununla birlikte, "ince ayar" bunun için güçlü bir kelime olabilir. Ne olursa olsun, yardımcı olabilir.

Martins Çözümü:

a.getClass().getName()

Ancak, herhangi bir şeyle çalışmasını istiyorsanız bunu yapabilirsiniz:

((Object) myVar).getClass().getName()
//OR
((Object) myInt).getClass().getSimpleName()

Bu durumda, ilkel basitçe bir Sarıcıya sarılır. Bu durumda ilkel nesneye sahip olacaksınız.

Ben kendim böyle kullandım:

private static String nameOf(Object o) {
    return o.getClass().getSimpleName();
}

Jenerik Kullanımı:

public static <T> String nameOf(T o) {
    return o.getClass().getSimpleName();
}

İlginç. Ben sadece kodunu denedim: System.out.println (((Object) Integer.parseInt ("12")) .getClass (). GetSimpleName ()); ve çalışıyor! \ o /
shevy

31

Arama Motorundan öğrendim (İngilizcem çok kötü, Yani kod ...) Değişkenin türü nasıl alınır? Güç kaynağı :

String str = "test";
String type = str.getClass().getName();
value: type = java.lang.String

Bu method :

str.getClass().getSimpleName();
value:String

şimdi örnek:

Object o = 1;
o.getClass().getSimpleName();
value:Integer

3

Değişkeniniz bir sınıf özniteliği olmadıkça (ve sınıf alanlarını almanız, doğru alanı adıyla almanız gerekmediği sürece) Joachim Sauer'ın söylediklerine, (değişken türü! Değer türü değil!) Bilmek mümkün değildir.

Aslında benim için herhangi bir a.xxx().yyy()yöntemin size doğru cevabı vermesi tamamen imkansızdır, çünkü cevabı aynı nesne üzerinde farklı olacaktır, bu yönteme adını verdiğiniz bağlama göre ...

Teehoo'nun dediği gibi, test etmek için tanımlanmış bir tür liste derliyorsanız instanceof kullanabilirsiniz, ancak aynı zamanda alt sınıfları doğru döndürür ...

Olası bir çözüm de java.lang.reflect.Fieldkendi Fieldsınıfınızın uygulanmasından ilham almak ve kendi sınıfınızı oluşturmak ve daha sonra tüm yerel değişkenlerinizi bu özel Fielduygulama olarak ilan etmek olacaktır ... ancak başka bir çözüm bulmanız daha iyi olur, değişkene neden ihtiyacınız olduğunu gerçekten merak ediyorum türü, sadece değer türü değil?


İçin "ama aynı zamanda gerçek dönen alt sınıfları alacak ..." , Ne demek düşünüyorum "ama aynı zamanda gerçek dönen ana sınıfları alacak ..." , değil mi?
skomisa

3

Java'nın operatör aşırı yükleme özelliğini kullanın

class Test {

    void printType(String x) {
        System.out.print("String");
    }

    void printType(int x) {     
        System.out.print("Int");
    }

    // same goes on with boolean,double,float,object ...

}

8
Java, operatör aşırı yüklenmesi kavramına sahip değildir, bu yöntem aşırı yükleme
nicoschl

2

Burada birden fazla çözümümüz olduğunu düşünüyorum:

  • örneği bir çözüm olabilir.

Neden? Java'da her sınıf, Object sınıfının kendisinden devralınır. Yani bir değişkeniniz varsa ve onun türünü bilmek istiyorsanız. Kullanabilirsiniz

  • System.out.println (((Obje), f) .getClass () getName ().);

veya

  • Integer.class.isInstance (1985); // doğru verir

veya

  • isPrimitive ()

    public static void main(String[] args) {
    
     ClassDemo classOne = new ClassDemo();
     Class classOneClass = classOne();
    
     int i = 5;
     Class iClass = int.class;
    
     // checking for primitive type
     boolean retval1 = classOneClass.isPrimitive();
     System.out.println("classOneClass is primitive type? = " + retval1);
    
     // checking for primitive type?
     boolean retval2 = iClass.isPrimitive();
     System.out.println("iClass is primitive type? = " + retval2);
    }

Bu bize şunları verecektir:

  1. YANLIŞ
  2. DOĞRU

Daha fazla bilgiyi burada bulabilirsiniz: İlkel değişkenin ilkel türü nasıl belirlenir?

https://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html

http://docs.oracle.com/cd/E26806_01/wlp.1034/e14255/com/bea/p13n/expression/operator/Instanceof.html

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.