2010-04-20 10 views
95

powiedzmy zadeklarować zmienną:Skąd znasz typ zmiennej w java?

String a = "test"; 

I chcę wiedzieć, jakiego typu jest to, to wyjście powinno być java.lang.String jaki sposób mogę to zrobić?

+1

naprawdę jesteś zainteresowany typu * zmiennej *? Czy zależy ci na * rodzaju wartości *? Ponieważ rodzaju zmiennej nie można łatwo uzyskać (w rzeczywistości nie jest to możliwe dla zmiennych lokalnych i wymaga refleksji dla pól). –

+0

@Joachim, jaka jest dokładnie różnica między "typem zmiennej" a "typem wartości"? –

+8

@Paul: Rozważ "Object o =" o ";' - typem zmiennej jest Object, typem tej wartości jest String. –

Odpowiedz

164
a.getClass().getName() 
+12

To da rodzaj wartości. niekoniecznie typ zmiennej. –

+4

Po prostu pomyślałem, że to, czego OP naprawdę szukał, ponieważ deklaracja 'a' jest dość oczywista w czasie kompilacji – Martin

+2

To by działało, gdyby typy nie były prymitywami ... Jeśli typ to int, jak się dowiedzieć Typ? –

21

Jeśli chcesz nazwę, użyj metody Martina. Jeśli chcesz wiedzieć, czy to wystąpienie pewnej klasy:

boolean b = a instanceof String

1

zgadzam się z tym, co Joachim Sauer powiedział, nie jest możliwe, aby wiedzieć (! Typ zmiennej nie typ wartości), chyba że zmienna jest atrybut klasy (i będziesz musiał pobrać pola klasy, uzyskaj właściwe pole po nazwie ...)

Właściwie dla mnie jest całkowicie niemożliwe, aby jakakolwiek metoda a.xxx().yyy() dała ci właściwą odpowiedź, ponieważ odpowiedź byłaby inna ten sam obiekt, zgodnie z kontekstem, w którym nazywasz tę metodę ...

Jak powiedział teehoo, jeśli wiesz, że podczas kompilowania zdefiniowanej listy typów do testowania możesz użyć instanceof, ale otrzymasz również podklasy zwracające true ...

Jednym z możliwych rozwiązań byłoby zainspirowanie się z wdrożenia java.lang.reflect.Field i stwórz własną klasę Field, a następnie zadeklaruj wszystkie zmienne lokalne jako niestandardową implementację Field ... ale lepiej znajdź inne rozwiązanie, naprawdę zastanawiam się, dlaczego potrzebujesz typu zmiennej, a nie tylko typ wartości?

22

Nauczyłem się z wyszukiwarki (mój angielski jest bardzo zły, więc kod ...) Jak uzyskać typ zmiennej? Up to:

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

ta metoda:

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

teraz przykład:

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

chciałbym rozwinąć odpowiedź Marcina tam ...

Jego rozwiązanie jest raczej fajnie, ale można go zmodyfikować tak, aby każdy "typ zmiennej" mógł być wydrukowany w ten sposób. (Tak naprawdę jest Typ wartości, more on the topic). Nie tak mocno podkręcona, jak wskazująca na możliwość.

Jego rozwiązanie było:

a.getClass().getName() 

Jeśli chcesz go do pracy z niczego można to zrobić:

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

W tym przypadku, po prostu prymitywny być owinięta w owijkę. W takim przypadku otrzymasz obiekt obiektu pierwotnego.

ja stosować go tak:

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

Korzystanie Generics:

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

Zastosowanie operatora przeciążenia funkcji java

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 ... 

} 
+4

Java nie ma pojęcia przeciążenia operatora, jest to przeciążanie metody – nicoschl

0

Myślę, że mamy wiele rozwiązań tutaj:

  • instace of może być rozwiązaniem.

Dlaczego? W Javie każda klasa jest dziedziczona z samej klasy Object. Więc jeśli masz zmienną i chcesz wiedzieć, jaki to będzie działać.

  • System.out.println ((((Obiekt) f) .getClass(). GetName());

lub

  • Integer.class.isInstance (1985); // daje prawdziwą

lub

  • 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); 
    } 
    

To da nam:

  1. FAŁSZ
  2. TRUE

dowiedzieć się więcej tutaj: How to determine the primitive type of a primitive variable?

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